private void FinishLap(LapInfo lapToFinish, SimulatorDataSet dataSet) { if (lapToFinish.Completed) { return; } lapToFinish.FinishLap(dataSet, DriverInfo); lapToFinish.SectorCompletedEvent -= LapSectorCompletedEvent; lapToFinish.LapInvalidatedEvent -= LapInvalidatedHandler; if (lapToFinish.LapTime == TimeSpan.Zero) { lapToFinish.InvalidateLap(LapInvalidationReasonKind.NoValidLapTime); RevertSectorChanges(lapToFinish); } if (ShouldLapBeDiscarded(lapToFinish, dataSet)) { _lapsInfo.Remove(lapToFinish); return; } if (lapToFinish.Valid && lapToFinish.LapTime != TimeSpan.Zero && (BestLap == null || lapToFinish.LapTime < BestLap.LapTime)) { BestLap = lapToFinish; } OnLapCompleted(new LapEventArgs(lapToFinish)); Logger.Info($"Driver {DriverInfo.DriverName}, Lap {lapToFinish.LapNumber} finnished. REASON: {lapToFinish.LapCompletionMethod}"); ComputePace(); PurgeLapsTelemetry(); }
public bool UpdateLaps(SimulatorDataSet set) { SessionInfo sessionInfo = set.SessionInfo; if (!sessionInfo.IsActive) { return(false); } if (sessionInfo.SessionPhase == SessionPhase.Countdown) { return(false); } if (DriverInfo.FinishStatus != DriverFinishStatus.Na && DriverInfo.FinishStatus != DriverFinishStatus.None && CurrentLap != null && CurrentLap.Completed) { return(false); } if (TopSpeed < DriverInfo.Speed && DriverInfo.Speed < _maximumVelocity) { TopSpeed = DriverInfo.Speed; } UpdateInPitsProperty(set); if (_lapsInfo.Count == 0) { LapInfo firstLap = new LapInfo(set, DriverInfo.CompletedLaps + 1, this, true, null); if (InvalidateFirstLap) { firstLap.InvalidateLap(LapInvalidationReasonKind.InvalidatedFirstLap); } firstLap.SectorCompletedEvent += LapSectorCompletedEvent; firstLap.LapInvalidatedEvent += LapInvalidatedHandler; _lapsInfo.Add(firstLap); OnNewLapStarted(new LapEventArgs(firstLap)); } if (LastLap != null && LastLap.IsPending && !LastLap.UpdatePendingState(set, DriverInfo)) { FinishLap(LastLap, set); } ILapInfo currentLap = CurrentLap; if (!currentLap.Completed) { UpdateCurrentLap(set); } if (_refreshBestSectorIndicationWatch.ElapsedMilliseconds > 2000) { UpdateBestSectorProperties(); _refreshBestSectorIndicationWatch.Restart(); } if (ShouldFinishLap(set, currentLap)) { if (!currentLap.SwitchToPendingIfNecessary(set, DriverInfo)) { FinishLap(currentLap, set); } CreateNewLap(set, currentLap); _previousTickLapDistance = DriverInfo.LapDistance; return(currentLap.Valid); } if (set.SimulatorSourceInfo.OverrideBestLap) { CheckAndOverrideBestLap(sessionInfo.TrackInfo.LayoutLength.InMeters); } _previousTickLapDistance = DriverInfo.LapDistance; return(false); }