コード例 #1
0
 protected virtual void DisplayLeadersStatus(NascarFeed.Models.LiveFeed.RootObject feed)
 {
     tsLeaders1.Model = new SingleFieldModel()
     {
         Count = feed.number_of_leaders + 1, SubCount = feed.number_of_lead_changes
     };
 }
コード例 #2
0
        protected virtual async Task ReadFeedDataAsync()
        {
            try
            {
                if (_apiClient == null)
                {
                    return;
                }

                _feedData = await _apiClient.GetLiveFeedAsync(EventSettings);

                _liveFlagData = await _apiClient.GetLiveFlagDataAsync();

                _pointsFeedData = await _apiClient.GetLivePointsAsync(EventSettings);

#if DEBUG
                //FeedWriter.LogFeedData(EventSettings, feedData.lap_number, feedData.ToString());
#endif

                ReadLapTimes(_feedData);

                DisplayFeedData(_feedData, _liveFlagData, _pointsFeedData);
            }
            catch (Exception ex)
            {
                ExceptionHandler(ex);
            }
            finally
            {
                this.ResumeLayout(true);
            }
        }
コード例 #3
0
        protected virtual string FormatTitle(NascarFeed.Models.LiveFeed.RootObject feed)
        {
            string titleTemplate = "r/NASCAR Timing and Scoring {0}";
            string titleDetail   = string.Empty;

            switch ((RunType)feed.run_type)
            {
            case RunType.Practice:
            {
                titleDetail = feed.run_name;
                break;
            }

            case RunType.Qualifying:
            {
                titleDetail = feed.run_name;
                break;
            }

            case RunType.Race:
            {
                titleDetail = $"{feed.run_name} - Stage {feed.stage.stage_num }";
                break;
            }
            }

            return(string.Format(titleTemplate, titleDetail));
        }
コード例 #4
0
        protected virtual IList <TSGridRowModel> FormatOffThePaceData(NascarFeed.Models.LiveFeed.RootObject feedData)
        {
            var models = new List <TSGridRowModel>();

            var vehicleGains = feedData.vehicles.
                               Where(v => v.status == 1). // Status 1=running, 2=off track, 3=out of event?
                               Select(v => new
            {
                CarNumber = v.vehicle_number,
                Driver    = v.driver.full_name,
                Gain      = v.position_differential_last_10_percent
            });

            int index = 0;

            foreach (var vehicle in vehicleGains.OrderBy(v => v.Gain).Take(8))
            {
                var model = new TSGridRowModel()
                {
                    Index     = index,
                    CarNumber = vehicle.CarNumber,
                    Driver    = vehicle.Driver,
                    Value     = vehicle.Gain.ToString()
                };

                models.Add(model);

                index++;
            }

            return(models);
        }
コード例 #5
0
        protected virtual IList <TSGridRowModel> FormatFastestLapData(NascarFeed.Models.LiveFeed.RootObject feedData)
        {
            var models = new List <TSGridRowModel>();

            var vehicleGains = feedData.vehicles.
                               Select(v => new
            {
                CarNumber  = v.vehicle_number,
                Driver     = v.driver.full_name,
                FastestLap = v.best_lap_speed
            });

            int index = 0;

            foreach (var vehicle in vehicleGains.OrderByDescending(v => v.FastestLap))
            {
                var model = new TSGridRowModel()
                {
                    Index     = index,
                    CarNumber = vehicle.CarNumber,
                    Driver    = vehicle.Driver,
                    Value     = vehicle.FastestLap.ToString("###.##")
                };

                models.Add(model);

                index++;
            }

            return(models);
        }
コード例 #6
0
        protected virtual IList <TSGridRowModel> FormatBiggestMoversData(NascarFeed.Models.LiveFeed.RootObject feedData)
        {
            var models = new List <TSGridRowModel>();

            var vehicleGains = feedData.vehicles.Select(v => new
            {
                CarNumber = v.vehicle_number,
                Driver    = v.driver.full_name,
                Gain      = v.position_differential_last_10_percent
            });

            int index = 0;

            foreach (var vehicle in vehicleGains.OrderByDescending(v => v.Gain).Take(8))
            {
                var model = new TSGridRowModel()
                {
                    Index     = index,
                    CarNumber = vehicle.CarNumber,
                    Driver    = vehicle.Driver,
                    Value     = vehicle.Gain.ToString()
                };

                models.Add(model);

                index++;
            }

            return(models);
        }
コード例 #7
0
        protected virtual IList <TSGridRowModel> FormatLapLeaders(NascarFeed.Models.LiveFeed.RootObject feedData)
        {
            var models = new List <TSGridRowModel>();

            foreach (var vehicle in feedData.vehicles.Where(v => v.laps_led.Count > 0))
            {
                var model = new TSLapLeaderGridRowModel()
                {
                    CarNumber     = vehicle.vehicle_number,
                    Driver        = vehicle.driver.full_name,
                    TotalLapsLed  = vehicle.laps_led.Sum(l => l.end_lap - l.start_lap),
                    TotalTimesLed = vehicle.laps_led.Count
                };

                model.Value = $"{model.TotalLapsLed} laps ({model.TotalTimesLed}x)";

                models.Add(model);
            }

            var sortedModels = models.OrderByDescending(m => ((TSLapLeaderGridRowModel)m).TotalLapsLed).ToList();

            for (int i = 0; i < models.Count; i++)
            {
                sortedModels[i].Index = i;
            }

            return(sortedModels);
        }
コード例 #8
0
        protected virtual IList <TSDriverModel> FormatLeaderboardData(NascarFeed.Models.LiveFeed.RootObject feedData)
        {
            double previousDelta = 0.0;

            var models = new List <TSDriverModel>();

            foreach (var vehicle in feedData.vehicles)
            {
                var model = new TSDriverModel()
                {
                    Position         = vehicle.running_position,
                    CarNumber        = vehicle.vehicle_number,
                    Driver           = vehicle.driver.full_name,
                    BehindLeader     = vehicle.delta,
                    Manufacturer     = vehicle.vehicle_manufacturer,
                    StartPosition    = vehicle.starting_position,
                    LastLapTime      = vehicle.last_lap_time,
                    FastestLapTime   = vehicle.best_lap_time,
                    FastestLapNumber = vehicle.best_lap,
                    LastPitLap       = vehicle.pit_stops.Count > 0 ? vehicle.pit_stops.LastOrDefault().pit_in_leader_lap : 0,
                    LapsComplete     = vehicle.laps_completed,
                    BehindNext       = vehicle.delta < 0 ?
                                       previousDelta < 0 ?
                                       vehicle.delta - previousDelta :
                                       vehicle.delta :
                                       vehicle.delta - previousDelta
                };

                models.Add(model);

                previousDelta = vehicle.delta;
            }

            return(models);
        }
コード例 #9
0
        protected virtual void DisplayRaceState(NascarFeed.Models.LiveFeed.RootObject feed)
        {
            Text = FormatTitle(feed);
            tsTrackState.LapInfo = FormatLapInfo(feed);
            lblOnLeadLap.Text    = feed.vehicles.Count(v => v.delta >= 0).ToString();
            lblYellowLaps.Text   = feed.number_of_caution_laps.ToString();
            lblGreenLaps.Text    = (feed.lap_number - feed.number_of_caution_laps).ToString();

            var sessionTimeSpan = new TimeSpan(0, 0, feed.elapsed_time);

            lblSession.Text = sessionTimeSpan.ToString();
        }
コード例 #10
0
 protected virtual void ReadLapTimes(NascarFeed.Models.LiveFeed.RootObject feed)
 {
     foreach (var vehicle in feed.vehicles)
     {
         _eventLapAverages.AddLapTime(new VehicleLapTime()
         {
             CarNumber     = vehicle.vehicle_number,
             LapNumber     = feed.lap_number,
             LapTime       = vehicle.last_lap_time,
             LapSpeed      = vehicle.last_lap_speed,
             VehicleStatus = (VehicleStatus)vehicle.status,
             TrackState    = (TrackState)feed.flag_state
         });
     }
 }
コード例 #11
0
        protected virtual string FormatLapInfo(NascarFeed.Models.LiveFeed.RootObject feed)
        {
            switch ((RunType)feed.run_type)
            {
            case RunType.Practice:
            {
                return(feed.run_name);
            }

            case RunType.Qualifying:
            {
                return(feed.run_name);
            }

            case RunType.Race:
            {
                switch (feed.stage.stage_num)
                {
                case 1:
                {
                    return($"STAGE {feed.stage.stage_num} - {feed.lap_number} OF {feed.stage.laps_in_stage} ({feed.lap_number} OF {feed.laps_in_race})");
                }

                case 2:
                {
                    int stageStartLap = feed.stage.finish_at_lap - feed.stage.laps_in_stage;
                    return($"STAGE {feed.stage.stage_num} - {feed.lap_number - stageStartLap} OF {feed.stage.laps_in_stage} ({feed.lap_number} OF {feed.laps_in_race})");
                }

                case 3:
                {
                    return($"{feed.lap_number} OF {feed.laps_in_race}");
                }

                default:
                {
                    return($"{feed.lap_number} OF {feed.laps_in_race}");
                }
                }
            }
            }

            return(feed.run_name);
        }
コード例 #12
0
        protected virtual void DisplayFeedData(
            NascarFeed.Models.LiveFeed.RootObject feedData,
            IList <NascarFeed.Models.LiveFlagData.RootObject> liveFlagData,
            IList <NascarFeed.Models.LivePoints.RootObject> pointsFeedData)
        {
            if (feedData == null)
            {
                return;
            }

            if (feedData.vehicles.Count == 0)
            {
                MessageBox.Show("No data available for the selected event");
                return;
            }

            Configuration.RunType = (RunType)feedData.run_type;

            this.SuspendLayout();

            DisplayTrackState(feedData);

            DisplayRaceState(feedData);

            tsLeaderboard1.Models = FormatLeaderboardData(feedData);

            tsLapLeaderGrid1.Models = FormatLapLeaders(feedData);

            if (Configuration.RunType == RunType.Race)
            {
                tsBiggestMoversGrid1.Models = FormatBiggestMoversData(feedData);

                tsOffThePaceGrid1.Models = FormatOffThePaceData(feedData);
            }

            DisplayLeadersStatus(feedData);

            DisplayCautionsStatus(liveFlagData, feedData);

            tsFastestLaps1.Models = FormatFastestLapData(feedData);

            tsPoints1.Models = FormatPointsData(pointsFeedData);
        }
コード例 #13
0
 protected virtual void DisplayCautionsStatus(
     IList <NascarFeed.Models.LiveFlagData.RootObject> liveFlagData,
     NascarFeed.Models.LiveFeed.RootObject feed)
 {
     if (liveFlagData.Count > 0)
     {
         var cautions     = liveFlagData.Where(f => f.elapsed_time >= 0 && f.flag_state == 2);
         var cautionCount = cautions.Select(c => c.lap_number).Distinct().Count();
         tsCautionLapsDisplay1.Model = new SingleFieldModel()
         {
             Count = cautionCount, SubCount = feed.number_of_caution_laps
         };
     }
     else
     {
         tsCautionLapsDisplay1.Model = new SingleFieldModel()
         {
             Count = feed.number_of_caution_segments, SubCount = feed.number_of_caution_laps
         };
     }
 }
コード例 #14
0
 protected virtual void DisplayTrackState(NascarFeed.Models.LiveFeed.RootObject feed)
 {
     tsTrackState.TrackState = (TrackState)feed.flag_state;
 }
コード例 #15
0
        protected virtual IList <TSDriverModel> FormatLeaderboardData(NascarFeed.Models.LiveFeed.RootObject feedData)
        {
            double previousDelta = 0.0;

            var models = new List <TSDriverModel>();

            var fastestThisLap = new List <TSDriverModel>();

            double fastestLapTimeThisLap = 999999;

            foreach (var vehicle in feedData.vehicles)
            {
                var model = new TSDriverModel()
                {
                    Position         = vehicle.running_position,
                    CarNumber        = vehicle.vehicle_number,
                    Driver           = vehicle.driver.full_name,
                    BehindLeader     = vehicle.delta,
                    Manufacturer     = vehicle.vehicle_manufacturer,
                    StartPosition    = vehicle.starting_position,
                    LastLapTime      = vehicle.last_lap_time,
                    FastestLapTime   = vehicle.best_lap_time,
                    FastestLapNumber = vehicle.best_lap,
                    LastPitLap       = vehicle.pit_stops.Count > 0 ? vehicle.pit_stops.LastOrDefault().pit_in_leader_lap : 0,
                    LapsComplete     = vehicle.laps_completed,
                    BehindNext       = vehicle.delta < 0 ?
                                       previousDelta < 0 ?
                                       vehicle.delta - previousDelta :
                                       vehicle.delta :
                                       vehicle.delta - previousDelta,
                    IsOnTrack      = vehicle.is_on_track,
                    VehicleStatus  = (VehicleStatus)vehicle.status,
                    IsUserFavorite = _userSettings.FavoriteDrivers.Any(f => f.Driver == vehicle.driver.full_name)
                };

                models.Add(model);

                previousDelta = vehicle.delta;

                if (model.VehicleStatus == VehicleStatus.OnTrack)
                {
                    if (model.LastLapTime == fastestLapTimeThisLap)
                    {
                        fastestThisLap.Add(model);
                    }
                    else if (model.LastLapTime < fastestLapTimeThisLap)
                    {
                        fastestThisLap.Clear();
                        fastestThisLap.Add(model);
                        fastestLapTimeThisLap = model.LastLapTime;
                    }
                }
            }

            foreach (var model in fastestThisLap)
            {
                model.FastestThisLap = true;
            }

            return(models);
        }