Provides detailed information about a single F1 timing session.
Inheritance: ModelBase, IMessageProcessor, IDriverModelLocator
Ejemplo n.º 1
0
            /// <summary>
            /// Initialises a new instance of the <see cref="SessionModelBuilder"/> class and specifies
            /// the <paramref name="session"/> to build.
            /// </summary>
            /// <param name="session">The session to build.</param>
            /// <exception cref="System.ArgumentNullException">
            /// Throw when <paramref name="session"/> is <see langword="null"/>.
            /// </exception>
            public SessionModelBuilder(SessionModel session)
            {
                Guard.NotNull(session, "session");

                Model = session;
                Drivers = new DriverMessageDispatcher(session);
            }
Ejemplo n.º 2
0
        public override void Run()
        {
            Message message;
            SessionModel session = new SessionModel();

            using(var input = File.OpenRead(_path))
            using(var reader = new DecoratedObjectReader(input))
            {
                while((message = reader.Read<Message>()) != null)
                {
                    session.Process(message);
                }
            }

            session.Print();
        }
Ejemplo n.º 3
0
        public static void Main(string[] args)
        {
            new SpeedCapturesModelTest().only_the_fastest_six_speeds_are_maintained();

            Message message;
            var session = new SessionModel();
            var path = @"D:\dev\.net\src\ak-f1-timing\tms\2011\14-singapore\race.tms";
            using(var reader = F1Timing.Playback.Read(path))
            {
                reader.PlaybackSpeed = 5000000d;
                while((message = reader.Read()) != null)
                {
                    session.Process(message);
                }
                Print(session.SpeedCaptures.S1);
                Print(session.SpeedCaptures.S2);
                Print(session.SpeedCaptures.S3);
                Print(session.SpeedCaptures.Straight);
                Debugger.Break();
            }
        }
Ejemplo n.º 4
0
 private static void WriteTrackStatistics(SessionModel session)
 {
     WriteLine();
     WriteLine("+------------------------------------------------------------------------------------------+");
     WriteLine("|                                  WEATHER STATISTICS                                      |");
     WriteLine("+------------------+-----------+-----------+-----------+-----------+-----------+-----------+");
     WriteLine("|                  |  Current  |    Avg    |    Min    |    Max    |   Range   |  STD DEV  |");
     WriteLine("+------------------+-----------+-----------+-----------+-----------+-----------+-----------+");
     WriteLine("|Air Temperature   |{0,11}|{1,11}|{2,11}|{3,11}|{4,11}|{5,11}|",
         Format.Temperature(session.Weather.AirTemperature.Current.Value),
         Format.Temperature(session.Weather.AirTemperature.Mean),
         Format.Temperature(session.Weather.AirTemperature.Minimum),
         Format.Temperature(session.Weather.AirTemperature.Maximum),
         Format.Temperature(session.Weather.AirTemperature.Range),
         Format.Temperature(session.Weather.AirTemperature.StandardDeviation));
     WriteLine("|Track Temperature |{0,11}|{1,11}|{2,11}|{3,11}|{4,11}|{5,11}|",
         Format.Temperature(session.Weather.TrackTemperature.Current),
         Format.Temperature(session.Weather.TrackTemperature.Mean),
         Format.Temperature(session.Weather.TrackTemperature.Minimum),
         Format.Temperature(session.Weather.TrackTemperature.Maximum),
         Format.Temperature(session.Weather.TrackTemperature.Range),
         Format.Temperature(session.Weather.TrackTemperature.StandardDeviation));
     WriteLine("|Pressure:         |{0,11}|{1,11}|{2,11}|{3,11}|{4,11}|{5,11}|",
         Format.Pressure(session.Weather.Pressure.Current),
         Format.Pressure(session.Weather.Pressure.Mean),
         Format.Pressure(session.Weather.Pressure.Minimum),
         Format.Pressure(session.Weather.Pressure.Maximum),
         Format.Pressure(session.Weather.Pressure.Range),
         Format.Pressure(session.Weather.Pressure.StandardDeviation));
     WriteLine("|Wind Speed:       |{0,11}|{1,11}|{2,11}|{3,11}|{4,11}|{5,11}|",
         Format.WindSpeed(session.Weather.WindSpeed.Current),
         Format.WindSpeed(session.Weather.WindSpeed.Mean),
         Format.WindSpeed(session.Weather.WindSpeed.Minimum),
         Format.WindSpeed(session.Weather.WindSpeed.Maximum),
         Format.WindSpeed(session.Weather.WindSpeed.Range),
         Format.WindSpeed(session.Weather.WindSpeed.StandardDeviation));
     WriteLine("|Wind Direction:   |{0,11}|{1,11}|{2,11}|{3,11}|{4,11}|{5,11}|",
         Format.WindDirection(session.Weather.WindAngle.Current.Value),
         Format.WindDirection(session.Weather.WindAngle.Mean),
         Format.WindDirection(session.Weather.WindAngle.Minimum),
         Format.WindDirection(session.Weather.WindAngle.Maximum),
         Format.WindDirection(session.Weather.WindAngle.Range),
         Format.WindDirection(session.Weather.WindAngle.StandardDeviation));
     WriteLine("|Humidity:         |{0,11}|{1,11}|{2,11}|{3,11}|{4,11}|{5,11}|",
         Format.Humidity(session.Weather.Humidity.Current),
         Format.Humidity(session.Weather.Humidity.Mean),
         Format.Humidity(session.Weather.Humidity.Minimum),
         Format.Humidity(session.Weather.Humidity.Maximum),
         Format.Humidity(session.Weather.Humidity.Range),
         Format.Humidity(session.Weather.Humidity.StandardDeviation));
     WriteLine("+------------------+-----------------------------------------------------------------------+");
 }
Ejemplo n.º 5
0
        private static void WriteSessionStatistics(SessionModel session)
        {
            WriteLine();
            WriteLine("+---------------------------------------+");
            WriteLine("|          SESSION STATISTICS           |");
            WriteLine("+------------------+--------------------+");
            WriteLine("|Session Type      |{0,20}|", session.SessionType);
            WriteLine("|Session Status    |{0,20}|", session.SessionStatus);
            WriteLine("|Session Time      |{0,20}|", session.ElapsedSessionTime);
            WriteLine("|Rem Session Time  |{0,20}|", session.RemainingSessionTime);
            WriteLine("|Session Laps      |{0,20}|", session.RaceLapNumber);
            WriteLine("|Drivers           |{0,20}|", session.Drivers.Count);
            WriteLine("+------------------+--------------------+");

            WriteLine("+--------------------------------------------------------------------+");
            WriteLine("|                       BEST LAP AND SECTOR TIMES                    |");
            WriteLine("+--------------------+-----------+-------+-------+-------+-----------+");
            WriteLine("| DRIVER             |      BEST |    S1 |    S2 |    S3 |      POSS |");
            WriteLine("+--------------------+-----------+-------+-------+-------+-----------+");
            foreach(DriverModel driver in session.Drivers) {
                TimeSpan sector;
                TimeSpan possible = TimeSpan.Zero;
                Write("|{0,-20}|", driver.Name);
                Write("{0,11}|", Format.LapTime(driver.LapTimes.Minimum));
                foreach(var times in driver.SectorTimes) {
                    // TODO !!!!!
                    possible += sector = times.Minimum != null ? times.Minimum.Value : TimeSpan.Zero;
                    Write("{0,7}|", Format.SectorTime(sector));
                }
                WriteLine("{0,11}|", "~" + Format.LapTime(possible));
            }
            WriteLine("+--------------------------------------------------------------------+");

            WriteLine();
            WriteLine("+---------------------------------------------+");
            WriteLine("|   TOTAL SECTOR / LAP TIME / PIT COUNTS      |");
            WriteLine("+--------------------+----+----+----+----+----+");
            WriteLine("| DRIVER             | S1 | S2 | S3 |  L |  P |");
            WriteLine("+--------------------+----+----+----+----+----+");
            foreach(DriverModel driver in session.Drivers) {
                Write("|{0,-20}|", driver.Name);
                foreach(var times in driver.SectorTimes) {
                    Write("{0,4}|", times.Values.Count);
                }
                Write("{0,4}|", driver.LapTimes.Values.Count);
                WriteLine("{0,4}|", driver.PitCount);
            }
            WriteLine("+--------------------+----+----+----+----+----+");
        }
Ejemplo n.º 6
0
 private static void WriteRace(SessionModel session)
 {
     WriteLine("+---+---+---+--------------------+-------+-------+-----------+-------+-------+-------+----+");
     WriteLine("| I | P | C | DRIVER             |   GAP |   INT |      TIME |    S1 |    S2 |    S3 |  P |");
     WriteLine("+---+---+---+--------------------+-------+-------+-----------+-------+-------+-------+----+");
     foreach(var row in ((RaceGridModel)session.Grid).Rows.OrderBy(r => r.RowIndex)) {
         Write("|");
         Write("{0,3}", row.DriverId);
         Write("|");
         Write("{0,3}", row.Position);
         Write("|");
         Write("{0,3}", row.CarNumber);
         Write("|");
         Write("{0,-20}", row.DriverName);
         Write("|");
         Write("{0,7}", row.Gap);
         Write("|");
         Write("{0,7}", row.Interval);
         Write("|");
         Write("{0,11}", row.LapTime);
         Write("|");
         Write("{0,7}", row.S1);
         Write("|");
         Write("{0,7}", row.S2);
         Write("|");
         Write("{0,7}", row.S3);
         Write("|");
         Write("{0,4}", row.PitCount);
         Write("|");
         WriteLine();
     }
     WriteLine("+-------------------------------------------------------------------------------------------+");
 }
Ejemplo n.º 7
0
 private static void WriteQually(SessionModel session)
 {
     WriteLine("+---+---+---+--------------------+-----------+-----------+-----------+-------+-------+-------+----+");
     WriteLine("| I | P | C | DRIVER             |     Q1    |     Q2    |     Q3    |    S1 |    S2 |    S3 |  L |");
     WriteLine("+---+---+---+--------------------+-----------+-----------+-----------+-------+-------+-------+----+");
     foreach(var row in ((QuallyGridModel)session.Grid).Rows.OrderBy(r => r.RowIndex)) {
         Write("|");
         Write("{0,3}", row.DriverId);
         Write("|");
         Write("{0,3}", row.Position);
         Write("|");
         Write("{0,3}", row.CarNumber);
         Write("|");
         Write("{0,-20}", row.DriverName);
         Write("|");
         Write("{0,11}", row.Q1);
         Write("|");
         Write("{0,11}", row.Q2);
         Write("|");
         Write("{0,11}", row.Q3);
         Write("|");
         Write("{0,7}", row.S1);
         Write("|");
         Write("{0,7}", row.S2);
         Write("|");
         Write("{0,7}", row.S3);
         Write("|");
         Write("{0,4}", row.Laps);
         Write("|");
         WriteLine();
     }
     WriteLine("+----------------------------------------------------------------------------------------------+");
 }
Ejemplo n.º 8
0
 private static void WritePractice(SessionModel session)
 {
     WriteLine("+---+---+---+--------------------+-----------+--------+-------+-------+-------+----+");
     WriteLine("| I | P | C | DRIVER             |      BEST |    GAP |    S1 |    S2 |    S3 |  L |");
     WriteLine("+---+---+---+--------------------+-----------+--------+-------+-------+-------+----+");
     foreach(var row in ((PracticeGridModel)session.Grid).Rows.OrderBy(r => r.RowIndex)) {
         Write("|");
         Write("{0,3}", row.DriverId);
         Write("|");
         Write("{0,3}", row.Position);
         Write("|");
         Write("{0,3}", row.CarNumber);
         Write("|");
         Write("{0,-20}", row.DriverName);
         Write("|");
         Write("{0,11}", row.Best);
         Write("|");
         Write("{0,8}", row.Gap);
         Write("|");
         Write("{0,7}", row.S1);
         Write("|");
         Write("{0,7}", row.S2);
         Write("|");
         Write("{0,7}", row.S3);
         Write("|");
         Write("{0,4}", row.Laps);
         Write("|");
         WriteLine();
     }
     WriteLine("+----------------------------------------------------------------------------------+");
 }
Ejemplo n.º 9
0
 private static void WriteTotalSectorLapTimeAndPitCounts(SessionModel session)
 {
     WriteLine();
     WriteLine("+---------------------------------------------+");
     WriteLine("|   TOTAL SECTOR / LAP TIME / PIT COUNTS      |");
     WriteLine("+--------------------+----+----+----+----+----+");
     WriteLine("| DRIVER             | S1 | S2 | S3 |  L |  P |");
     WriteLine("+--------------------+----+----+----+----+----+");
     foreach(var driver in session.Drivers)
     {
         Write("|{0,-20}|", driver.Name);
         Write("{0,4}|", driver.LapTimes.S1.Items.Count);
         Write("{0,4}|", driver.LapTimes.S2.Items.Count);
         Write("{0,4}|", driver.LapTimes.S3.Items.Count);
         Write("{0,4}|", driver.LapTimes.Laps.Items.Count);
         WriteLine("{0,4}|", driver.PitTimes.Count);
     }
     WriteLine("+--------------------+----+----+----+----+----+");
 }
Ejemplo n.º 10
0
 private static void WriteSpeedCaptures(SessionModel session)
 {
     WriteLine();
     WriteLine("+---------------------------------------------------------------------------------------------------------------+");
     WriteLine("|                                                 SPEED CAPTURES                                                |");
     WriteLine("+---------------------------+---------------------------+---------------------------+---------------------------+");
     WriteLine("|            S1             |            S2             |            S3             |            TRAP           |");
     WriteLine("+---------------------------+---------------------------+---------------------------+---------------------------+");
     Action<ReadOnlyObservableCollection<SpeedCaptureModel>, int> writeCapture = (captures, i) =>
     {
         Write("{0,-20}", i < captures.Count ? captures[i].Driver.Name : string.Empty);
         Write("{0,7}|", i < captures.Count ? Format.Speed(captures[i].Speed) : string.Empty);
     };
     var model = session.SpeedCaptures;
     for(int i = 0, l = new[] { model.S1.Count, model.S2.Count, model.S3.Count, model.Straight.Count }.Max(); i < l; ++i)
     {
         Write("|");
         writeCapture(session.SpeedCaptures.S1, i);
         writeCapture(session.SpeedCaptures.S2, i);
         writeCapture(session.SpeedCaptures.S3, i);
         writeCapture(session.SpeedCaptures.Straight, i);
         WriteLine();
     }
     WriteLine("+---------------------------+---------------------------+---------------------------+---------------------------+");
 }
Ejemplo n.º 11
0
 private static void WriteSessionStatistics(SessionModel session)
 {
     WriteLine();
     WriteLine("+---------------------------------------+");
     WriteLine("|          SESSION STATISTICS           |");
     WriteLine("+------------------+--------------------+");
     WriteLine("|Session Type      |{0,20}|", session.SessionType);
     WriteLine("|Session Status    |{0,20}|", session.SessionStatus);
     WriteLine("|Session Time      |{0,20}|", session.ElapsedSessionTime);
     WriteLine("|Rem Session Time  |{0,20}|", session.RemainingSessionTime);
     WriteLine("|Session Laps      |{0,20}|", session.RaceLapNumber);
     WriteLine("|Drivers           |{0,20}|", session.Drivers.Count);
     WriteLine("|Message Count     |{0,20}|", session.Feed.MessageCount);
     WriteLine("+------------------+--------------------+");
 }
Ejemplo n.º 12
0
 private static void WriteBestLapAndSectorTimes(SessionModel session)
 {
     WriteLine();
     WriteLine("+--------------------------------------------------------------------+");
     WriteLine("|                       BEST LAP AND SECTOR TIMES                    |");
     WriteLine("+--------------------+-----------+-------+-------+-------+-----------+");
     WriteLine("| DRIVER             |      BEST |    S1 |    S2 |    S3 |      POSS |");
     WriteLine("+--------------------+-----------+-------+-------+-------+-----------+");
     foreach(var driver in session.Drivers.OrderBy(x => x.LapTimes.Laps.Minimum))
     {
         var times = driver.LapTimes;
         Write("|{0,-20}|", driver.Name);
         Write("{0,11}|", Format.LapTime(times.Laps.Minimum));
         Write("{0,7}|", Format.SectorTime(times.S1.Minimum));
         Write("{0,7}|", Format.SectorTime(times.S2.Minimum));
         Write("{0,7}|", Format.SectorTime(times.S3.Minimum));
         TimeSpan? possible = null;
         if(times.S1.Minimum != null && times.S2.Minimum != null && times.S3.Minimum != null)
         {
             possible = times.S1.Minimum.Time + times.S2.Minimum.Time + times.S3.Minimum.Time;
         }
         Write("{0,11}|", Format.LapTime(possible));
         WriteLine();
     }
     WriteLine("+--------------------------------------------------------------------+");
 }