Beispiel #1
0
        protected override void DaemonMethod()
        {
            _connectionTime = DateTime.MinValue;
            while (!ShouldDisconnect)
            {
                Thread.Sleep(TickTime);
                Rf2FullData      rFactorData = Load();
                SimulatorDataSet dataSet;
                try
                {
                    dataSet = _rf2DataConvertor.CreateSimulatorDataSet(rFactorData);
                }
                catch (RF2InvalidPackageException)
                {
                    continue;
                }

                if (CheckSessionStarted(rFactorData, dataSet))
                {
                    RaiseSessionStartedEvent(dataSet);
                }

                RaiseDataLoadedEvent(dataSet);

                if (!IsProcessRunning())
                {
                    ShouldDisconnect = true;
                }
            }
            Disconnect();
            RaiseDisconnectedEvent();
        }
Beispiel #2
0
        private bool CheckSessionStarted(Rf2FullData rfData, SimulatorDataSet dataSet)
        {
            if (_previousSessionTime.TotalSeconds - 1 > dataSet.SessionInfo.SessionTime.TotalSeconds)
            {
                Logger.Info($"New Session - Session time is less. Oldtime : {_previousSessionTime.TotalSeconds} - New Time: {dataSet.SessionInfo.SessionTime.TotalSeconds}");
                return(true);
            }

            if (_rawLastSessionType != rfData.scoring.mScoringInfo.mSession || _lastSessionType != dataSet.SessionInfo.SessionType)
            {
                Logger.Info("New Session - Session type doesn't match");
                _lastSessionType    = dataSet.SessionInfo.SessionType;
                _rawLastSessionType = rfData.scoring.mScoringInfo.mSession;
                _lastSessionPhase   = dataSet.SessionInfo.SessionPhase;
                return(true);
            }

            if (dataSet.SessionInfo.SessionPhase != _lastSessionPhase && _lastSessionPhase != SessionPhase.Green && dataSet.SessionInfo.SessionPhase != SessionPhase.Countdown)
            {
                Logger.Info("New Session - Session phase doesn't match");
                _lastSessionType    = dataSet.SessionInfo.SessionType;
                _rawLastSessionType = rfData.scoring.mScoringInfo.mSession;
                _lastSessionPhase   = dataSet.SessionInfo.SessionPhase;
                return(true);
            }
            return(false);
        }
Beispiel #3
0
 private void AddLappingInformation(SimulatorDataSet data, Rf2FullData rfData, DriverInfo driverInfo)
 {
     if (data.SessionInfo.SessionType == SessionType.Race && _lastPlayer != null &&
         _lastPlayer.CompletedLaps != 0)
     {
         driverInfo.IsBeingLappedByPlayer =
             driverInfo.TotalDistance < (_lastPlayer.TotalDistance - rfData.scoring.mScoringInfo.mLapDist * 0.5);
         driverInfo.IsLappingPlayer =
             _lastPlayer.TotalDistance < (driverInfo.TotalDistance - rfData.scoring.mScoringInfo.mLapDist * 0.5);
     }
 }
Beispiel #4
0
        internal void AddDriversData(SimulatorDataSet data, Rf2FullData rfData)
        {
            if (rfData.scoring.mScoringInfo.mNumVehicles < 1)
            {
                return;
            }

            data.DriversInfo = new DriverInfo[rfData.scoring.mScoringInfo.mNumVehicles];
            DriverInfo playersInfo = null;

            for (int i = 0; i < rfData.scoring.mScoringInfo.mNumVehicles; i++)
            {
                rF2VehicleScoring rF2VehicleScoring = rfData.scoring.mVehicles[i];
                DriverInfo        driverInfo        = CreateDriverInfo(rfData, rF2VehicleScoring);

                if (driverInfo.IsPlayer)
                {
                    playersInfo = driverInfo;
                    driverInfo.CurrentLapValid = true;
                    _lastPlayerId = rF2VehicleScoring.mID;
                }
                else
                {
                    driverInfo.CurrentLapValid = true;
                }

                data.DriversInfo[i] = driverInfo;
                if (driverInfo.Position == 1)
                {
                    data.SessionInfo.LeaderCurrentLap = driverInfo.CompletedLaps + 1;
                    data.LeaderInfo = driverInfo;
                }

                AddLappingInformation(data, rfData, driverInfo);
                FillTimingInfo(driverInfo, rF2VehicleScoring, rfData);

                if (driverInfo.FinishStatus == DriverFinishStatus.Finished && !driverInfo.IsPlayer && driverInfo.Position > _lastPlayer.Position)
                {
                    driverInfo.CompletedLaps--;
                    driverInfo.FinishStatus = DriverFinishStatus.None;
                }
            }
            CheckValidityByPlayer(playersInfo);
            _lastPlayer = playersInfo;
            if (playersInfo != null)
            {
                data.PlayerInfo = playersInfo;
            }

            FillGapInformation(data.DriversInfo);
        }
Beispiel #5
0
        public SimulatorDataSet CreateSimulatorDataSet(Rf2FullData rfData)
        {
            SimulatorDataSet simData = new SimulatorDataSet("Rfactor 2");

            simData.SimulatorSourceInfo.HasLapTimeInformation = true;
            simData.SimulatorSourceInfo.SimNotReportingEndOfOutLapCorrectly = true;
            simData.SimulatorSourceInfo.SectorTimingSupport = DataInputSupport.FULL;

            FillSessionInfo(rfData, simData);
            AddDriversData(simData, rfData);

            if (_lastPlayerId == -1)
            {
                return(simData);
            }

            try
            {
                rF2VehicleTelemetry playerF2VehicleTelemetry =
                    rfData.telemetry.mVehicles.First(x => x.mID == _lastPlayerId);

                FillPlayersGear(playerF2VehicleTelemetry, simData);

                // PEDAL INFO
                AddPedalInfo(playerF2VehicleTelemetry, simData);

                // WaterSystemInfo
                AddWaterSystemInfo(playerF2VehicleTelemetry, simData);

                // OilSystemInfo
                AddOilSystemInfo(playerF2VehicleTelemetry, simData);

                // Brakes Info
                AddBrakesInfo(playerF2VehicleTelemetry, simData);

                // Tyre Pressure Info
                AddTyresAndFuelInfo(simData, playerF2VehicleTelemetry);

                // Acceleration
                AddAcceleration(simData, playerF2VehicleTelemetry);

                currentlyIgnoredPackage = 0;
            }
            catch (ArgumentException)
            {
            }

            return(simData);
        }
Beispiel #6
0
        private Rf2FullData Load()
        {
            if (!IsConnected)
            {
                throw new InvalidOperationException("Not connected");
            }

            Rf2FullData data = new Rf2FullData()
            {
                extended  = _extendedBuffer.GetMappedDataUnSynchronized(),
                scoring   = _scoringBuffer.GetMappedDataUnSynchronized(),
                telemetry = _telemetryBuffer.GetMappedDataUnSynchronized(),
                rules     = _rulesBuffer.GetMappedDataUnSynchronized()
            };

            return(data);
        }
Beispiel #7
0
        private bool CheckSessionStarted(Rf2FullData rfData, SimulatorDataSet dataSet)
        {
            if (_rawLastSessionType != rfData.scoring.mScoringInfo.mSession || _lastSessionType != dataSet.SessionInfo.SessionType)
            {
                _lastSessionType    = dataSet.SessionInfo.SessionType;
                _rawLastSessionType = rfData.scoring.mScoringInfo.mSession;
                _lastSessionPhase   = dataSet.SessionInfo.SessionPhase;
                return(true);
            }

            if (dataSet.SessionInfo.SessionPhase != _lastSessionPhase && _lastSessionPhase != SessionPhase.Green && dataSet.SessionInfo.SessionPhase != SessionPhase.Countdown)
            {
                _lastSessionType    = dataSet.SessionInfo.SessionType;
                _rawLastSessionType = rfData.scoring.mScoringInfo.mSession;
                _lastSessionPhase   = dataSet.SessionInfo.SessionPhase;
                return(true);
            }
            return(false);
        }
Beispiel #8
0
        protected override async Task DaemonMethod(CancellationToken cancellationToken)
        {
            _connectionTime = DateTime.MinValue;
            while (!ShouldDisconnect)
            {
                await Task.Delay(TickTime, cancellationToken).ConfigureAwait(false);

                Rf2FullData      rFactorData = Load();
                SimulatorDataSet dataSet;
                try
                {
                    dataSet = _rf2DataConvertor.CreateSimulatorDataSet(rFactorData);
                }
                catch (RF2InvalidPackageException ex)
                {
                    if (ex.InnerException != null)
                    {
                        Logger.Error(ex, "RF2Invalid Package Caused by Exception");
                    }
                    continue;
                }

                if (CheckSessionStarted(rFactorData, dataSet))
                {
                    _sessionTimeInterpolator.Reset();
                    RaiseSessionStartedEvent(dataSet);
                }

                _previousSessionTime = dataSet.SessionInfo.SessionTime;
                RaiseDataLoadedEvent(dataSet);

                if (!IsProcessRunning())
                {
                    ShouldDisconnect = true;
                }
            }
            Disconnect();
            RaiseDisconnectedEvent();
        }
Beispiel #9
0
        private DriverInfo CreateDriverInfo(Rf2FullData rfData, rF2VehicleScoring rfVehicleInfo)
        {
            DriverInfo driverInfo = new DriverInfo
            {
                DriverName    = StringExtensions.FromArray(rfVehicleInfo.mDriverName),
                CompletedLaps = rfVehicleInfo.mTotalLaps,
                CarName       = StringExtensions.FromArray(rfVehicleInfo.mVehicleName),
                InPits        = rfVehicleInfo.mInPits == 1
            };

            driverInfo.IsPlayer = rfVehicleInfo.mIsPlayer == 1;
            driverInfo.Position = rfVehicleInfo.mPlace;
            driverInfo.Speed    = Velocity.FromMs(Math.Sqrt((rfVehicleInfo.mLocalVel.x * rfVehicleInfo.mLocalVel.x)
                                                            + (rfVehicleInfo.mLocalVel.y * rfVehicleInfo.mLocalVel.y)
                                                            + (rfVehicleInfo.mLocalVel.z * rfVehicleInfo.mLocalVel.z)));
            driverInfo.LapDistance   = rfVehicleInfo.mLapDist;
            driverInfo.TotalDistance = rfVehicleInfo.mTotalLaps * rfData.scoring.mScoringInfo.mLapDist + rfVehicleInfo.mLapDist;
            driverInfo.FinishStatus  = FromRFStatus(rfVehicleInfo.mFinishStatus);
            driverInfo.WorldPosition = new Point3D(Distance.FromMeters(rfVehicleInfo.mPos.x), Distance.FromMeters(rfVehicleInfo.mPos.y), Distance.FromMeters(rfVehicleInfo.mPos.z));
            ComputeDistanceToPlayer(_lastPlayer, driverInfo, rfData);
            return(driverInfo);
        }
Beispiel #10
0
        private void AddFlags(Rf2FullData rfData, SimulatorDataSet simData)
        {
            if ((rFactor2Constants.rF2GamePhase)rfData.scoring.mScoringInfo.mGamePhase == rFactor2Constants.rF2GamePhase.FullCourseYellow)
            {
                simData.SessionInfo.ActiveFlags.Add(FlagKind.FullCourseYellow);
                return;
            }

            if (rfData.scoring.mScoringInfo.mSectorFlag[0] == 1)
            {
                simData.SessionInfo.ActiveFlags.Add(FlagKind.YellowSector1);
            }

            if (rfData.scoring.mScoringInfo.mSectorFlag[1] == 1)
            {
                simData.SessionInfo.ActiveFlags.Add(FlagKind.YellowSector2);
            }

            if (rfData.scoring.mScoringInfo.mSectorFlag[2] == 1)
            {
                simData.SessionInfo.ActiveFlags.Add(FlagKind.YellowSector3);
            }
        }
Beispiel #11
0
        internal void FillSessionInfo(Rf2FullData data, SimulatorDataSet simData)
        {
            // Timing
            simData.SessionInfo.SessionTime                  = TimeSpan.FromSeconds(data.scoring.mScoringInfo.mCurrentET);
            simData.SessionInfo.TrackInfo.LayoutLength       = data.scoring.mScoringInfo.mLapDist;
            simData.SessionInfo.TrackInfo.TrackName          = StringExtensions.FromArray(data.scoring.mScoringInfo.mTrackName);
            simData.SessionInfo.TrackInfo.TrackLayoutName    = String.Empty;
            simData.SessionInfo.WeatherInfo.AirTemperature   = Temperature.FromCelsius(data.scoring.mScoringInfo.mAmbientTemp);
            simData.SessionInfo.WeatherInfo.TrackTemperature = Temperature.FromCelsius(data.scoring.mScoringInfo.mTrackTemp);
            simData.SessionInfo.WeatherInfo.RainIntensity    = (int)(data.scoring.mScoringInfo.mRaining * 100);

            if (data.scoring.mScoringInfo.mTrackTemp == 0 && data.scoring.mScoringInfo.mSession == 0 && data.scoring.mScoringInfo.mGamePhase == 0 &&
                string.IsNullOrEmpty(simData.SessionInfo.TrackInfo.TrackName) &&
                data.scoring.mScoringInfo.mLapDist == 0)
            {
                simData.SessionInfo.SessionType  = SessionType.Na;
                simData.SessionInfo.SessionPhase = SessionPhase.Countdown;
                return;
            }

            switch (data.scoring.mScoringInfo.mSession)
            {
            case -1:
                simData.SessionInfo.SessionType = SessionType.Na;
                break;

            case 0:
            case 1:
            case 2:
            case 3:
            case 4:
                simData.SessionInfo.SessionType = SessionType.Practice;
                break;

            case 5:
            case 6:
            case 7:
            case 8:
                simData.SessionInfo.SessionType = SessionType.Qualification;
                break;

            case 9:
                simData.SessionInfo.SessionType = SessionType.WarmUp;
                break;

            case 10:
            case 11:
            case 12:
            case 13:
                simData.SessionInfo.SessionType = SessionType.Race;
                break;

            default:
                simData.SessionInfo.SessionType = SessionType.Practice;
                break;
            }

            switch ((rFactor2Constants.rF2GamePhase)data.scoring.mScoringInfo.mGamePhase)
            {
            case rFactor2Constants.rF2GamePhase.Garage:
                break;

            case rFactor2Constants.rF2GamePhase.WarmUp:
            case rFactor2Constants.rF2GamePhase.GridWalk:
            case rFactor2Constants.rF2GamePhase.Formation:
            case rFactor2Constants.rF2GamePhase.Countdown:
                simData.SessionInfo.SessionPhase = SessionPhase.Countdown;
                break;

            case rFactor2Constants.rF2GamePhase.SessionStopped:
            case rFactor2Constants.rF2GamePhase.FullCourseYellow:
            case rFactor2Constants.rF2GamePhase.GreenFlag:
                simData.SessionInfo.SessionPhase = SessionPhase.Green;
                break;

            case rFactor2Constants.rF2GamePhase.SessionOver:
                simData.SessionInfo.SessionPhase = SessionPhase.Checkered;
                break;
            }

            simData.SessionInfo.IsActive = simData.SessionInfo.SessionType != SessionType.Na;



            // ReSharper disable once CompareOfFloatsByEqualityOperator
            if (data.scoring.mScoringInfo.mEndET > 0)
            {
                simData.SessionInfo.SessionLengthType    = SessionLengthType.Time;
                simData.SessionInfo.SessionTimeRemaining =
                    data.scoring.mScoringInfo.mEndET - data.scoring.mScoringInfo.mCurrentET > 0 ? data.scoring.mScoringInfo.mEndET - data.scoring.mScoringInfo.mCurrentET : 0;
            }
            else
            {
                simData.SessionInfo.SessionLengthType = SessionLengthType.Laps;
                simData.SessionInfo.TotalNumberOfLaps = data.scoring.mScoringInfo.mMaxLaps;
            }
        }
Beispiel #12
0
        internal static void ComputeDistanceToPlayer(DriverInfo player, DriverInfo driverInfo, Rf2FullData Rf2FullData)
        {
            if (player == null)
            {
                return;
            }

            if (driverInfo.FinishStatus == DriverInfo.DriverFinishStatus.Dq || driverInfo.FinishStatus == DriverInfo.DriverFinishStatus.Dnf ||
                driverInfo.FinishStatus == DriverInfo.DriverFinishStatus.Dnq || driverInfo.FinishStatus == DriverInfo.DriverFinishStatus.Dns)
            {
                driverInfo.DistanceToPlayer = double.MaxValue;
                return;
            }

            double trackLength       = Rf2FullData.scoring.mScoringInfo.mLapDist;
            double playerLapDistance = player.LapDistance;

            double distanceToPlayer = playerLapDistance - driverInfo.LapDistance;

            if (distanceToPlayer < -(trackLength / 2))
            {
                distanceToPlayer = distanceToPlayer + trackLength;
            }

            if (distanceToPlayer > (trackLength / 2))
            {
                distanceToPlayer = distanceToPlayer - trackLength;
            }

            driverInfo.DistanceToPlayer = distanceToPlayer;
        }
Beispiel #13
0
        internal void FillTimingInfo(DriverInfo driverInfo, rF2VehicleScoring rfVehicleInfo, Rf2FullData Rf2FullData)
        {
            driverInfo.Timing.LastSector1Time = CreateTimeSpan(rfVehicleInfo.mCurSector1);
            driverInfo.Timing.LastSector2Time = CreateTimeSpan(rfVehicleInfo.mCurSector2 - rfVehicleInfo.mCurSector1);
            driverInfo.Timing.LastSector3Time = CreateTimeSpan(rfVehicleInfo.mLastLapTime - rfVehicleInfo.mLastSector2);
            driverInfo.Timing.LastLapTime     = CreateTimeSpan(rfVehicleInfo.mLastLapTime);
            driverInfo.Timing.CurrentSector   = rfVehicleInfo.mSector == 0 ? 3 : rfVehicleInfo.mSector;

            switch (driverInfo.Timing.CurrentSector)
            {
            case 1:
                driverInfo.Timing.CurrentLapTime = CreateTimeSpan(rfVehicleInfo.mCurSector1);
                break;

            case 2:
                driverInfo.Timing.CurrentLapTime = CreateTimeSpan(rfVehicleInfo.mCurSector2);
                break;

            case 0:
                driverInfo.Timing.CurrentLapTime = CreateTimeSpan(rfVehicleInfo.mLastLapTime);
                break;
            }
        }
Beispiel #14
0
        internal void AddDriversData(SimulatorDataSet data, Rf2FullData rfData)
        {
            if (rfData.scoring.mScoringInfo.mNumVehicles < 1)
            {
                return;
            }

            data.DriversInfo = new DriverInfo[rfData.scoring.mScoringInfo.mNumVehicles];
            DriverInfo playersInfo = null;

            for (int i = 0; i < rfData.scoring.mScoringInfo.mNumVehicles; i++)
            {
                rF2VehicleScoring   rF2VehicleScoring   = rfData.scoring.mVehicles[i];
                rF2VehicleTelemetry rF2VehicleTelemetry = rfData.telemetry.mVehicles[i];
                DriverInfo          driverInfo          = CreateDriverInfo(rfData, rF2VehicleScoring);

                if (driverInfo.IsPlayer)
                {
                    playersInfo = driverInfo;
                    driverInfo.CurrentLapValid = true;
                    _lastPlayerId = rF2VehicleScoring.mID;
                }
                else
                {
                    driverInfo.CarInfo.WheelsInfo.FrontLeft.TyreType  = StringExtensions.FromArray(rF2VehicleTelemetry.mFrontTireCompoundName);
                    driverInfo.CarInfo.WheelsInfo.FrontRight.TyreType = driverInfo.CarInfo.WheelsInfo.FrontLeft.TyreType;
                    driverInfo.CarInfo.WheelsInfo.RearRight.TyreType  = StringExtensions.FromArray(rF2VehicleTelemetry.mRearTireCompoundName);
                    driverInfo.CarInfo.WheelsInfo.RearLeft.TyreType   = driverInfo.CarInfo.WheelsInfo.RearRight.TyreType;
                    driverInfo.CurrentLapValid = true;
                }

                data.DriversInfo[i] = driverInfo;
                if (driverInfo.Position == 1)
                {
                    data.SessionInfo.LeaderCurrentLap = driverInfo.CompletedLaps + 1;
                    data.LeaderInfo = driverInfo;
                }

                if (rF2VehicleScoring.mControl == 2)
                {
                    data.SessionInfo.IsMultiplayer = true;
                }

                AddLappingInformation(data, rfData, driverInfo);
                FillTimingInfo(driverInfo, rF2VehicleScoring, rfData);

                if (driverInfo.FinishStatus == DriverFinishStatus.Finished && !driverInfo.IsPlayer && driverInfo.Position > _lastPlayer.Position)
                {
                    driverInfo.CompletedLaps--;
                    driverInfo.FinishStatus = DriverFinishStatus.None;
                }
            }
            CheckValidityByPlayer(playersInfo);
            _lastPlayer = playersInfo;
            if (playersInfo != null)
            {
                data.PlayerInfo = playersInfo;
            }

            FillGapInformation(data.DriversInfo);
        }
Beispiel #15
0
        public SimulatorDataSet CreateSimulatorDataSet(Rf2FullData rfData)
        {
            try
            {
                SimulatorDataSet simData = new SimulatorDataSet("RFactor 2");
                simData.SimulatorSourceInfo.GapInformationProvided = GapInformationKind.TimeToSurroundingDrivers;
                simData.SimulatorSourceInfo.HasLapTimeInformation  = true;
                simData.SimulatorSourceInfo.SimNotReportingEndOfOutLapCorrectly = true;
                simData.SimulatorSourceInfo.InvalidateLapBySector = true;
                simData.SimulatorSourceInfo.SectorTimingSupport   = DataInputSupport.Full;
                simData.SimulatorSourceInfo.TelemetryInfo.ContainsSuspensionTravel = true;
                //simData.SimulatorSourceInfo.TelemetryInfo.ContainsSuspensionVelocity = true;

                /*                simData.SimulatorSourceInfo.TelemetryInfo.RequiresDistanceInterpolation = true;
                 *              simData.SimulatorSourceInfo.TelemetryInfo.RequiresPositionInterpolation = true;*/

                FillSessionInfo(rfData, simData);
                AddDriversData(simData, rfData);

                if (_lastPlayerId == -1)
                {
                    return(simData);
                }

                rF2VehicleTelemetry playerF2VehicleTelemetry =
                    rfData.telemetry.mVehicles.First(x => x.mID == _lastPlayerId);

                if (playerF2VehicleTelemetry.mElapsedTime > 0)
                {
                    simData.SessionInfo.SessionTime = TimeSpan.FromSeconds(playerF2VehicleTelemetry.mElapsedTime);
                }

                FillPlayerCarInfo(playerF2VehicleTelemetry, simData);

                // PEDAL INFO
                AddPedalInfo(playerF2VehicleTelemetry, simData);

                // WaterSystemInfo
                AddWaterSystemInfo(playerF2VehicleTelemetry, simData);

                // OilSystemInfo
                AddOilSystemInfo(playerF2VehicleTelemetry, simData);

                // Brakes Info
                AddBrakesInfo(playerF2VehicleTelemetry, simData);

                // Tyre Pressure Info
                AddTyresAndFuelInfo(simData, playerF2VehicleTelemetry);

                // Acceleration
                AddAcceleration(simData, playerF2VehicleTelemetry);

                //Add Additional Player Car Info
                AddPlayerCarInfo(playerF2VehicleTelemetry, simData);

                AddFlags(rfData, simData);

                currentlyIgnoredPackage = 0;

                PopulateClassPositions(simData);

                return(simData);
            }catch (Exception ex)
            {
                _lastPlayerId = -1;
                _lastPlayer   = new DriverInfo();
                throw new RF2InvalidPackageException(ex);
            }
        }