Exemple #1
0
        private void AddPlayerCarInfo(rF2VehicleTelemetry data, SimulatorDataSet simData)
        {
            CarInfo playerCar = simData.PlayerInfo.CarInfo;

            int totalDent = data.mDentSeverity.Aggregate((x, y) => (byte)(x + y));
            int maxDent   = data.mDentSeverity.Max();

            playerCar.CarDamageInformation.Bodywork.Damage = totalDent / 16.0;
            if (maxDent == 1)
            {
                playerCar.CarDamageInformation.Bodywork.MediumDamageThreshold = playerCar.CarDamageInformation.Bodywork.Damage;
            }
            else if (maxDent == 2)
            {
                playerCar.CarDamageInformation.Bodywork.MediumDamageThreshold = 0;
                playerCar.CarDamageInformation.Bodywork.HeavyDamageThreshold  = playerCar.CarDamageInformation.Bodywork.Damage;
            }

            if (data.mOverheating == 1)
            {
                playerCar.CarDamageInformation.Engine.Damage = 1;
            }

            /*playerCar.WorldOrientation = new Orientation()
             * {
             *  Yaw = Angle.GetFromRadians(Math.Atan2(data.mOri[2].x, data.mOri[2].z)),
             * };*/

            playerCar.SpeedLimiterEngaged = data.mSpeedLimiter == 1;
            playerCar.FrontDownForce      = Force.GetFromNewtons(data.mFrontDownforce);
            playerCar.RearDownForce       = Force.GetFromNewtons(data.mRearDownforce);
        }
Exemple #2
0
        private void AddTyresAndFuelInfo(SimulatorDataSet simData, rF2VehicleTelemetry playerVehicleTelemetry)
        {
            simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.TyrePressure =
                Pressure.FromKiloPascals(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mPressure);
            simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.TyrePressure =
                Pressure.FromKiloPascals(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mPressure);
            simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.TyrePressure =
                Pressure.FromKiloPascals(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mPressure);
            simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.TyrePressure =
                Pressure.FromKiloPascals(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mPressure);



            simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.TyreWear =
                1 - playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mWear;
            simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.TyreWear =
                1 - playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mWear;
            simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.TyreWear =
                1 - playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mWear;
            simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.TyreWear =
                1 - playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mWear;

            // Front Left Tyre Temps
            simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.LeftTyreTemp =
                Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mTemperature[0]);
            simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.RightTyreTemp =
                Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mTemperature[2]);
            simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.CenterTyreTemp =
                Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mTemperature[1]);


            // Front Right Tyre Temps
            simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.LeftTyreTemp =
                Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mTemperature[0]);
            simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.RightTyreTemp =
                Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mTemperature[2]);
            simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.CenterTyreTemp =
                Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mTemperature[1]);


            // Rear Left Tyre Temps
            simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.LeftTyreTemp =
                Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mTemperature[0]);
            simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.RightTyreTemp =
                Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mTemperature[2]);
            simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.CenterTyreTemp =
                Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mTemperature[1]);

            // Rear Right Tyre Temps
            simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.LeftTyreTemp =
                Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mTemperature[0]);
            simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.RightTyreTemp =
                Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mTemperature[2]);
            simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.CenterTyreTemp =
                Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mTemperature[1]);

            // Fuel System
            simData.PlayerInfo.CarInfo.FuelSystemInfo.FuelCapacity  = Volume.FromLiters(playerVehicleTelemetry.mFuelCapacity);
            simData.PlayerInfo.CarInfo.FuelSystemInfo.FuelRemaining = Volume.FromLiters(playerVehicleTelemetry.mFuel);
        }
Exemple #3
0
        private void FillPlayerCarInfo(rF2VehicleTelemetry playerVehicleTelemetry, SimulatorDataSet simData)
        {
            TimeSpan playerSessionTime = TimeSpan.FromSeconds(playerVehicleTelemetry.mElapsedTime);

            //simData.SessionInfo.SessionTime = playerSessionTime;

            /*if (playerSessionTime > simData.SessionInfo.SessionTime && playerSessionTime > _lastPlayerTime)
             * {
             *  simData.SessionInfo.SessionTime = playerSessionTime;
             *  _lastPlayerTime = playerSessionTime;
             * }
             * else
             * {
             *  playerSessionTime = TimeSpan.Zero;
             * }*/
            simData.PlayerInfo.CarInfo.EngineRpm = (int)playerVehicleTelemetry.mEngineRPM;
            switch (playerVehicleTelemetry.mGear)
            {
            case 0:
                simData.PlayerInfo.CarInfo.CurrentGear = "N";
                break;

            case -1:
                simData.PlayerInfo.CarInfo.CurrentGear = "R";
                break;

            case -2:
                simData.PlayerInfo.CarInfo.CurrentGear = string.Empty;
                break;

            default:
                simData.PlayerInfo.CarInfo.CurrentGear = playerVehicleTelemetry.mGear.ToString();
                break;
            }
        }
Exemple #4
0
 private static void AddPedalInfo(rF2VehicleTelemetry playerVehicleTelemetry, SimulatorDataSet simData)
 {
     simData.InputInfo.ThrottlePedalPosition = playerVehicleTelemetry.mUnfilteredThrottle;
     simData.InputInfo.BrakePedalPosition    = playerVehicleTelemetry.mUnfilteredBrake;
     simData.InputInfo.ClutchPedalPosition   = playerVehicleTelemetry.mUnfilteredClutch;
     simData.InputInfo.SteeringInput         = playerVehicleTelemetry.mUnfilteredSteering;
 }
Exemple #5
0
 private static void AddBrakesInfo(rF2VehicleTelemetry playerVehicleTelemetry, SimulatorDataSet simData)
 {
     simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.BrakeTemperature = Temperature.FromKelvin(
         playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mBrakeTemp);
     simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.BrakeTemperature = Temperature.FromKelvin(
         playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mBrakeTemp);
     simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.BrakeTemperature = Temperature.FromKelvin(
         playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mBrakeTemp);
     simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.BrakeTemperature = Temperature.FromKelvin(
         playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mBrakeTemp);
 }
Exemple #6
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);
        }
Exemple #7
0
        public static rF2VehicleTelemetry GetPlayerTelemetry(int id, ref rF2Telemetry telemetry)
        {
            var playerVehTelemetry = new rF2VehicleTelemetry();

            for (int i = 0; i < telemetry.mNumVehicles; ++i)
            {
                var vehicle = telemetry.mVehicles[i];

                if (vehicle.mID == id)
                {
                    playerVehTelemetry = vehicle;

                    break;
                }
            }

            return(playerVehTelemetry);
        }
Exemple #8
0
        private static void FillPlayersGear(rF2VehicleTelemetry playerVehicleTelemetry, SimulatorDataSet simData)
        {
            switch (playerVehicleTelemetry.mGear)
            {
            case 0:
                simData.PlayerInfo.CarInfo.CurrentGear = "N";
                break;

            case -1:
                simData.PlayerInfo.CarInfo.CurrentGear = "R";
                break;

            case -2:
                simData.PlayerInfo.CarInfo.CurrentGear = String.Empty;
                break;

            default:
                simData.PlayerInfo.CarInfo.CurrentGear = playerVehicleTelemetry.mGear.ToString();
                break;
            }
        }
Exemple #9
0
 private static void AddWaterSystemInfo(rF2VehicleTelemetry playerVehicleTelemetry, SimulatorDataSet simData)
 {
     simData.PlayerInfo.CarInfo.WaterSystemInfo.WaterTemperature = Temperature.FromCelsius(playerVehicleTelemetry.mEngineWaterTemp);
 }
Exemple #10
0
        public async Task Run(CancellationToken token)
        {
            var hubConnection = await _connectionManager.Connect();

            var telemetry = new rF2Telemetry();
            var scoring   = new rF2Scoring();

            var playerScoring   = new rF2VehicleScoring();
            var playerTelemetry = new rF2VehicleTelemetry();

            while (true)
            {
                await Task.Delay(200);

                try
                {
                    _scoringBuffer.GetMappedDataPartial(ref scoring);
                    _telemetryBuffer.GetMappedDataPartial(ref telemetry);
                }
                catch (Exception)
                {
                    await _connectionManager.Disconnect(hubConnection);

                    return;
                }

                if (telemetry.mNumVehicles != 0 && scoring.mScoringInfo.mNumVehicles != 0 && (rFactor2Constants.rF2GamePhase)scoring.mScoringInfo.mGamePhase == rFactor2Constants.rF2GamePhase.GreenFlag)
                {
                    var mappedIds = MapmIdToPositionInArray(ref telemetry);

                    foreach (var scoringVehicle in scoring.mVehicles)
                    {
                        switch ((rFactor2Constants.rF2Control)scoringVehicle.mControl)
                        {
                        case rFactor2Constants.rF2Control.AI:
                        case rFactor2Constants.rF2Control.Player:
                        case rFactor2Constants.rF2Control.Remote:
                            if (scoringVehicle.mIsPlayer == 1)
                            {
                                playerScoring = scoringVehicle;
                            }
                            break;

                        default:
                            continue;
                        }
                        if (playerScoring.mIsPlayer == 1)
                        {
                            break;
                        }
                    }

                    var playerTelemetryId = -1;
                    if (mappedIds.TryGetValue(playerScoring.mID, out playerTelemetryId))
                    {
                        playerTelemetry = telemetry.mVehicles[playerTelemetryId];
                    }
                    else
                    {
                        continue;
                    }

                    var telemetryToSend = new Test
                    {
                        Telemetry = new Telemetry(ref playerTelemetry)
                    };
                    await hubConnection.SendAsync("Send", telemetryToSend);
                }
            }
        }
Exemple #11
0
        ApiResponse getData()
        {
            ApiResponse res = new ApiResponse();

            Console.Clear();
            Program.extendedBuffer.GetMappedData(ref Program.extended);
            Program.scoringBuffer.GetMappedData(ref Program.scoring);
            Program.telemetryBuffer.GetMappedData(ref Program.telemetry);
            Program.rulesBuffer.GetMappedData(ref Program.rules);

            var scoring   = Program.scoring;
            var telemetry = Program.telemetry;
            var rules     = Program.rules;

            res.Session = new LiveTiming.Session
            {
                MaxLaps          = scoring.mScoringInfo.mMaxLaps,
                MaxTime          = scoring.mScoringInfo.mEndET - Constants.MAXTIMECOUNTDOWN, // I assume that the seconds are just becaus of the red light countdown until the lights go on
                CurrentTime      = Math.Floor(scoring.mScoringInfo.mCurrentET),
                CurrentLaps      = 0,
                YellowFlags      = new bool[3],
                IsRace           = scoring.mScoringInfo.mSession >= 10 && scoring.mScoringInfo.mSession <= 13,
                IsSessionStarted = scoring.mScoringInfo.mGamePhase == 5,
                IsVCY            = scoring.mScoringInfo.mGamePhase == 6
            };
            for (int i = 0; i < 3; i++)
            {
                int raw = Convert.ToInt32(scoring.mScoringInfo.mSectorFlag[i]);
                res.Session.YellowFlags[i] = raw != 11;
            }
            foreach (sbyte flag in scoring.mScoringInfo.mSectorFlag)
            {
                rF2YellowFlagState state = (rF2YellowFlagState)flag;

                Console.WriteLine("Flag {0}", (rF2YellowFlagState)flag);
            }

            List <Entry> entries = new List <Entry>();

            for (int i = 0; i < scoring.mScoringInfo.mNumVehicles; ++i)
            {
                rF2VehicleScoring   vehicle           = scoring.mVehicles[i];
                rF2VehicleTelemetry vehicleTelementry = telemetry.mVehicles[i];
                dynamic             foo = vehicle.mTrackEdge; //??
                Console.WriteLine(foo);
                rF2TrackRulesParticipant participant = rules.mParticipants[i];


                String[] nameParts = this.GetStringFromBytes(vehicle.mDriverName).Split(' ');

                String   vehicleName      = this.GetStringFromBytes(vehicleTelementry.mVehicleName);
                String[] vehicleNameParts = vehicleName.Split('#');
                int      number           = 999;
                try
                {
                    number = Convert.ToInt32(vehicleNameParts[1]);
                }
                catch (Exception)
                {
                }
                String teamName = this.GetStringFromBytes(vehicle.mPitGroup);
                String format   = "{0}";

                foreach (JObject driverEntry in this.entries.Children())
                {
                    if (driverEntry["driverNumber"].ToString() == number.ToString())
                    {
                        teamName = driverEntry["teamName"].ToString();
                        format   = driverEntry["driverNumberFormat"].ToString();
                    }
                }

                TimeSpan diff          = TimeSpan.FromSeconds(vehicle.mTimeBehindNext);
                String   diffString    = diff.ToString();
                String   bestLapString = TimeSpan.FromSeconds(vehicle.mBestLapTime).ToString(@"mm\:ss\:fff");
                String   lastLapString = TimeSpan.FromSeconds(vehicle.mLastLapTime).ToString(@"mm\:ss\:fff");

                if (diff.TotalHours < 1)
                {
                    if (diff.TotalMinutes < 1)
                    {
                        diffString = diff.ToString(@"ss\:fff");
                    }
                    else
                    {
                        diffString = diff.ToString(@"mm\:ss\:fff");
                    }
                }

                diffString = String.Format("+ {0}", diffString);
                int positionDifference = Program.lastResponse != null ? vehicle.mPlace - Program.lastResponse.Drivers.First(d => d.SlotID == vehicle.mID).Position : 0;
                Console.Write(positionDifference);
                Entry entry = new Entry
                {
                    SlotID             = vehicle.mID,
                    TeamName           = teamName,
                    VehicleName        = vehicleNameParts.Length > 1 ? vehicleNameParts[0] : vehicleName,
                    NumberFormat       = format,
                    Number             = number,
                    FormattedNumber    = String.Format(format, number),
                    FirstName          = nameParts.Length > 1 ? nameParts[0] : "",
                    LastName           = nameParts.Length > 1 ? nameParts[1] : nameParts[0],
                    Position           = vehicle.mPlace,
                    EntryClass         = this.GetStringFromBytes(vehicle.mVehicleClass),
                    FrontTires         = this.GetStringFromBytes(vehicleTelementry.mFrontTireCompoundName),
                    RearTires          = this.GetStringFromBytes(vehicleTelementry.mRearTireCompoundName),
                    PitState           = Constants.PitStates[vehicle.mPitState],
                    TimeBehind         = vehicle.mTimeBehindNext,
                    TimeBehindString   = diffString,
                    LapsBehind         = vehicle.mLapsBehindNext,
                    Stops              = vehicle.mNumPitstops,
                    Status             = Constants.Status[vehicle.mFinishStatus],
                    HasHeatingProblem  = vehicleTelementry.mOverheating != 0,
                    HasLostParts       = vehicleTelementry.mDetached != 0,
                    CurrentLapString   = TimeSpan.FromSeconds(res.Session.CurrentTime - vehicleTelementry.mLapStartET).ToString(@"mm\:ss\:fff"),
                    PositionDifference = vehicle.mQualification - vehicle.mPlace,
                    LastSectorTimes    = new double[]
                    {
                        vehicle.mLastSector1,
                        vehicle.mLastSector2,
                        vehicle.mLastLapTime - vehicle.mLastSector2
                    },
                    BestSectorTimes = new double[]
                    {
                        vehicle.mBestSector1,
                        vehicle.mBestSector2,
                        vehicle.mBestLapTime - vehicle.mBestSector2
                    },
                    BestLap       = vehicle.mBestLapTime,
                    LastLap       = vehicle.mLastLapTime,
                    LastLapString = lastLapString,
                    BestLapString = bestLapString,
                    Laps          = vehicle.mTotalLaps,
                    CurrentSessionPositionDifference = positionDifference
                };
                if (entry.Position == 1)
                {
                    res.Session.CurrentLaps = entry.Laps;
                }
                entries.Add(entry);
            }
            // Set fastest lap
            Entry fastestDriver = entries.First(d => d.BestLap == entries.Min(e => e.BestLap));

            entries.ForEach(e =>
            {
                e.BestLapDelta = e.BestLap - fastestDriver.BestLap;
                TimeSpan diff  = TimeSpan.FromSeconds(e.BestLapDelta);
                if (diff.TotalMinutes < 1.0)
                {
                    e.BestLapDeltaString = "+ " + diff.ToString(@"ss\:fff");
                }
                else
                {
                    e.BestLapDeltaString = "+ " + diff.ToString(@"mm\:ss\:fff");
                }
            });

            if (res.Session.MaxLaps == int.MaxValue)
            {
                TimeSpan current = TimeSpan.FromSeconds(Math.Floor(scoring.mScoringInfo.mCurrentET));
                TimeSpan max     = TimeSpan.FromSeconds(Math.Floor(scoring.mScoringInfo.mEndET - Constants.MAXTIMECOUNTDOWN));
                res.Session.SessionLeftString = String.Format("{0}/ {1}", current, max);
            }
            else
            {
                res.Session.CurrentLaps       = entries.Max(e => e.Laps);
                res.Session.SessionLeftString = String.Format("{0}/ {1}", res.Session.CurrentLaps, res.Session.MaxLaps);
            }
            res.Drivers = entries.ToArray();
            res.RaceOverlayControlSet   = this.parsedJSON["controlSet"].ToString();
            res.CommandId               = Convert.ToInt32(this.parsedJSON["commandId"]);
            res.Session.IsSessionPaused = res.RaceOverlayControlSet.IndexOf("pause") != -1;
            // Translate the slot id (wich means the position) to the proper rfactor 2 id:
            bool driverFound = false;

            if (res.RaceOverlayControlSet.IndexOf("currentDriver") != -1)
            {
                String driverName = JObject.Parse(res.RaceOverlayControlSet)["currentDriver"].ToString();
                foreach (Entry driver in res.Drivers)
                {
                    if (driver.FirstName + " " + driver.LastName == driverName)
                    {
                        res.SlotId  = driver.SlotID;
                        driverFound = true;
                        break;
                    }
                }
            }
            else
            {
                foreach (Entry driver in res.Drivers)
                {
                    if (driver.Position == Convert.ToInt32(this.parsedJSON["slotId"].ToString()))
                    {
                        res.SlotId  = driver.SlotID;
                        driverFound = true;
                        break;
                    }
                }
            }

            res.SlotId   = Program.lastResponse != null && res.SlotId == 0 ? Program.lastResponse.SlotId : res.SlotId;
            res.CameraId = Convert.ToInt32(this.parsedJSON["cameraId"].ToString());
            if (!driverFound && Program.lastResponse != null)
            {
                res.SlotId    = Program.lastResponse.SlotId;
                res.CameraId  = Program.lastResponse.CameraId;
                res.CommandId = Program.lastResponse.CameraId;
            }
            // Write control file for rfactor plugin
            // TODO: ADD A PROPER TIMEOUT
            try
            {
                if (Program.lastResponse == null || Program.lastResponse.CameraId != res.CameraId || Program.lastResponse.SlotId != res.SlotId)
                {
                    string[] lines = { res.SlotId.ToString(), res.CameraId.ToString() };
                    String   path  = Path.Combine(Path.GetTempPath(), "cameraslots.txt");
                    System.IO.File.WriteAllLines(path, lines);
                }
            }
            catch
            {
            }
            Program.lastResponse = res;
            return(res);
        }
Exemple #12
0
        private void AddTyresAndFuelInfo(SimulatorDataSet simData, rF2VehicleTelemetry playerVehicleTelemetry)
        {
            simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.TyrePressure.ActualQuantity =
                Pressure.FromKiloPascals(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mPressure);
            simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.TyrePressure.ActualQuantity =
                Pressure.FromKiloPascals(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mPressure);
            simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.TyrePressure.ActualQuantity =
                Pressure.FromKiloPascals(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mPressure);
            simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.TyrePressure.ActualQuantity =
                Pressure.FromKiloPascals(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mPressure);

            simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.Detached  = playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mDetached == 1 || playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mFlat == 1;
            simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.Detached = playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mDetached == 1 || playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mFlat == 1;
            simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.Detached   = playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mDetached == 1 || playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mFlat == 1;
            simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.Detached  = playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mDetached == 1 || playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mFlat == 1;

            simData.PlayerInfo.CarInfo.RearHeight  = Distance.FromMeters(playerVehicleTelemetry.mRearRideHeight);
            simData.PlayerInfo.CarInfo.FrontHeight = Distance.FromMeters(playerVehicleTelemetry.mFrontWingHeight);

            simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.Camber  = Angle.GetFromRadians(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mCamber);
            simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.Camber = Angle.GetFromRadians(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mCamber);
            simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.Camber   = Angle.GetFromRadians(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mCamber);
            simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.Camber  = Angle.GetFromRadians(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mCamber);

            //Tyre RPS
            simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.Rps  = -playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mRotation;
            simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.Rps = -playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mRotation;
            simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.Rps   = -playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mRotation;
            simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.Rps  = -playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mRotation;

            //Ride Tyre Height
            simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.RideHeight  = Distance.FromMeters(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mRideHeight);
            simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.RideHeight = Distance.FromMeters(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mRideHeight);
            simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.RideHeight   = Distance.FromMeters(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mRideHeight);
            simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.RideHeight  = Distance.FromMeters(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mRideHeight);

            //Suspension Deflection
            simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.SuspensionTravel  = Distance.FromMeters(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mSuspensionDeflection);
            simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.SuspensionTravel = Distance.FromMeters(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mSuspensionDeflection);
            simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.SuspensionTravel   = Distance.FromMeters(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mSuspensionDeflection);
            simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.SuspensionTravel  = Distance.FromMeters(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mSuspensionDeflection);


            simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.TyreWear.ActualWear =
                1 - playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mWear;
            simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.TyreWear.ActualWear =
                1 - playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mWear;
            simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.TyreWear.ActualWear =
                1 - playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mWear;
            simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.TyreWear.ActualWear =
                1 - playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mWear;

            // Front Left Tyre Temps
            simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.LeftTyreTemp.ActualQuantity =
                Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mTemperature[0]);
            simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.RightTyreTemp.ActualQuantity =
                Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mTemperature[2]);
            simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.CenterTyreTemp.ActualQuantity =
                Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mTemperature[1]);
            simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.TyreCoreTemperature.ActualQuantity =
                Temperature.FromKelvin(Math.Min(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontLeft].mTireCarcassTemperature, 2000));
            simData.PlayerInfo.CarInfo.WheelsInfo.FrontLeft.TyreType = StringExtensions.FromArray(playerVehicleTelemetry.mFrontTireCompoundName);


            // Front Right Tyre Temps
            simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.LeftTyreTemp.ActualQuantity =
                Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mTemperature[0]);
            simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.RightTyreTemp.ActualQuantity =
                Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mTemperature[2]);
            simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.CenterTyreTemp.ActualQuantity =
                Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mTemperature[1]);
            simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.TyreCoreTemperature.ActualQuantity =
                Temperature.FromKelvin(Math.Min(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.FrontRight].mTireCarcassTemperature, 2000));
            simData.PlayerInfo.CarInfo.WheelsInfo.FrontRight.TyreType = StringExtensions.FromArray(playerVehicleTelemetry.mFrontTireCompoundName);


            // Rear Left Tyre Temps
            simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.LeftTyreTemp.ActualQuantity =
                Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mTemperature[0]);
            simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.RightTyreTemp.ActualQuantity =
                Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mTemperature[2]);
            simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.CenterTyreTemp.ActualQuantity =
                Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mTemperature[1]);
            simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.TyreCoreTemperature.ActualQuantity =
                Temperature.FromKelvin(Math.Min(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearLeft].mTireCarcassTemperature, 2000));
            simData.PlayerInfo.CarInfo.WheelsInfo.RearLeft.TyreType = StringExtensions.FromArray(playerVehicleTelemetry.mRearTireCompoundName);

            // Rear Right Tyre Temps
            simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.LeftTyreTemp.ActualQuantity =
                Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mTemperature[0]);
            simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.RightTyreTemp.ActualQuantity =
                Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mTemperature[2]);
            simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.CenterTyreTemp.ActualQuantity =
                Temperature.FromKelvin(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mTemperature[1]);
            simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.TyreCoreTemperature.ActualQuantity =
                Temperature.FromKelvin(Math.Min(playerVehicleTelemetry.mWheels[(int)rFactor2Constants.rF2WheelIndex.RearRight].mTireCarcassTemperature, 2000));
            simData.PlayerInfo.CarInfo.WheelsInfo.RearRight.TyreType = StringExtensions.FromArray(playerVehicleTelemetry.mRearTireCompoundName);

            // Fuel System
            simData.PlayerInfo.CarInfo.FuelSystemInfo.FuelCapacity  = Volume.FromLiters(playerVehicleTelemetry.mFuelCapacity);
            simData.PlayerInfo.CarInfo.FuelSystemInfo.FuelRemaining = Volume.FromLiters(playerVehicleTelemetry.mFuel);
        }
Exemple #13
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);
        }
Exemple #14
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);
            }
        }
Exemple #15
0
 private static void AddOilSystemInfo(rF2VehicleTelemetry playerVehicleTelemetry, SimulatorDataSet simData)
 {
     simData.PlayerInfo.CarInfo.OilSystemInfo.OptimalOilTemperature.ActualQuantity = Temperature.FromCelsius(playerVehicleTelemetry.mEngineOilTemp);
     simData.PlayerInfo.CarInfo.TurboPressure = Pressure.FromKiloPascals(playerVehicleTelemetry.mTurboBoostPressure / 1000);
 }
Exemple #16
0
 private void AddAcceleration(SimulatorDataSet simData, rF2VehicleTelemetry playerVehicleTelemetry)
 {
     simData.PlayerInfo.CarInfo.Acceleration.XinMs = playerVehicleTelemetry.mLocalAccel.x;
     simData.PlayerInfo.CarInfo.Acceleration.YinMs = playerVehicleTelemetry.mLocalAccel.y;
     simData.PlayerInfo.CarInfo.Acceleration.ZinMs = playerVehicleTelemetry.mLocalAccel.z;
 }
 public Telemetry(ref rF2VehicleTelemetry telemetry)
 {
     RubberTemperatures  = telemetry.mWheels.Select(x => new RubberTemperature(x)).ToList();
     CarcassTemperatures = telemetry.mWheels.Select(x => new CarcassTemperature(x)).ToList();
 }
Exemple #18
0
        // Corrdinate conversion:
        // rF2 +x = screen +x
        // rF2 +z = screen -z
        // rF2 +yaw = screen -yaw
        // If I don't flip z, the projection will look from below.
        void View_Paint(object sender, PaintEventArgs e)
        {
            var g = e.Graphics;

            this.tracker.TrackPhase(ref this.scoring, ref this.telemetry, ref this.extended, g, this.logPhaseAndState);
            this.tracker.TrackDamage(ref this.scoring, ref this.telemetry, ref this.extended, g, this.logDamage);
            this.tracker.TrackTimings(ref this.scoring, ref this.telemetry, ref this.rules, ref this.extended, g, this.logTiming);
            this.tracker.TrackRules(ref this.scoring, ref this.telemetry, ref this.rules, ref this.extended, g, this.logRules);

            this.UpdateFPS();

            if (!this.connected)
            {
                var brush = new SolidBrush(System.Drawing.Color.Black);
                g.DrawString("Not connected", SystemFonts.DefaultFont, brush, 3.0f, 3.0f);

                if (this.logLightMode)
                {
                    return;
                }
            }
            else
            {
                var brush = new SolidBrush(System.Drawing.Color.Green);

                var   currX         = 3.0f;
                var   currY         = 3.0f;
                float yStep         = SystemFonts.DefaultFont.Height;
                var   gameStateText = new StringBuilder();
                gameStateText.Append(
                    $"Plugin Version:    Expected: 2.2.1.0 64bit   Actual: {MainForm.GetStringFromBytes(this.extended.mVersion)} {(this.extended.is64bit == 1 ? "64bit" : "32bit")}    FPS: {this.fps}");

                // Draw header
                g.DrawString(gameStateText.ToString(), SystemFonts.DefaultFont, brush, currX, currY);

                gameStateText.Clear();

                // Build map of mID -> telemetry.mVehicles[i].
                // They are typically matching values, however, we need to handle online cases and dropped vehicles (mID can be reused).
                var idsToTelIndices = new Dictionary <long, int>();
                for (int i = 0; i < this.telemetry.mNumVehicles; ++i)
                {
                    if (!idsToTelIndices.ContainsKey(this.telemetry.mVehicles[i].mID))
                    {
                        idsToTelIndices.Add(this.telemetry.mVehicles[i].mID, i);
                    }
                }

                var playerVehScoring = GetPlayerScoring(ref this.scoring);

                var scoringPlrId      = playerVehScoring.mID;
                var playerVeh         = new rF2VehicleTelemetry();
                int resolvedPlayerIdx = -1; // We're fine here with unitialized vehicle telemetry..
                if (idsToTelIndices.ContainsKey(scoringPlrId))
                {
                    resolvedPlayerIdx = idsToTelIndices[scoringPlrId];
                    playerVeh         = this.telemetry.mVehicles[resolvedPlayerIdx];
                }

                // Figure out prev session end player mID
                var playerSessionEndInfo = new rF2VehScoringCapture();
                for (int i = 0; i < this.extended.mSessionTransitionCapture.mNumScoringVehicles; ++i)
                {
                    var veh = this.extended.mSessionTransitionCapture.mScoringVehicles[i];
                    if (veh.mIsPlayer == 1)
                    {
                        playerSessionEndInfo = veh;
                    }
                }

                gameStateText.Append(
                    "mElapsedTime:\n"
                    + "mCurrentET:\n"
                    + "mElapsedTime-mCurrentET:\n"
                    + "mDetlaTime:\n"
                    + "mInvulnerable:\n"
                    + "mVehicleName:\n"
                    + "mTrackName:\n"
                    + "mLapStartET:\n"
                    + "mLapDist:\n"
                    + "mEndET:\n"
                    + "mPlayerName:\n"
                    + "mPlrFileName:\n\n"
                    + "Session Started:\n"
                    + "Sess. End Session:\n"
                    + "Sess. End Phase:\n"
                    + "Sess. End Place:\n"
                    + "Sess. End Finish:\n"
                    );

                // Col 1 labels
                g.DrawString(gameStateText.ToString(), SystemFonts.DefaultFont, brush, currX, currY += yStep);

                gameStateText.Clear();

                gameStateText.Append(
                    $"{playerVeh.mElapsedTime:N3}\n"
                    + $"{this.scoring.mScoringInfo.mCurrentET:N3}\n"
                    + $"{(playerVeh.mElapsedTime - this.scoring.mScoringInfo.mCurrentET):N3}\n"
                    + $"{playerVeh.mDeltaTime:N3}\n"
                    + (this.extended.mPhysics.mInvulnerable == 0 ? "off" : "on") + "\n"
                    + $"{MainForm.GetStringFromBytes(playerVeh.mVehicleName)}\n"
                    + $"{MainForm.GetStringFromBytes(playerVeh.mTrackName)}\n"
                    + $"{playerVeh.mLapStartET:N3}\n"
                    + $"{this.scoring.mScoringInfo.mLapDist:N3}\n"
                    + (this.scoring.mScoringInfo.mEndET < 0.0 ? "Unknown" : this.scoring.mScoringInfo.mEndET.ToString("N3")) + "\n"
                    + $"{MainForm.GetStringFromBytes(this.scoring.mScoringInfo.mPlayerName)}\n"
                    + $"{MainForm.GetStringFromBytes(this.scoring.mScoringInfo.mPlrFileName)}\n\n"
                    + $"{this.extended.mSessionStarted != 0}\n"
                    + $"{TransitionTracker.GetSessionString(this.extended.mSessionTransitionCapture.mSession)}\n"
                    + $"{(rFactor2Constants.rF2GamePhase)this.extended.mSessionTransitionCapture.mGamePhase}\n"
                    + $"{playerSessionEndInfo.mPlace}\n"
                    + $"{(rFactor2Constants.rF2FinishStatus)playerSessionEndInfo.mFinishStatus}\n"
                    );

                // Col1 values
                g.DrawString(gameStateText.ToString(), SystemFonts.DefaultFont, Brushes.Purple, currX + 145, currY);

                if (this.scoring.mScoringInfo.mNumVehicles == 0 ||
                    resolvedPlayerIdx == -1) // We need telemetry for stats below.
                {
                    return;
                }

                gameStateText.Clear();

                gameStateText.Append(
                    "mTimeIntoLap:\n"
                    + "mEstimatedLapTime:\n"
                    + "mTimeBehindNext:\n"
                    + "mTimeBehindLeader:\n"
                    + "mPitGroup:\n"
                    + "mLapDist(Plr):\n"
                    + "mLapDist(Est):\n"
                    + "yaw:\n"
                    + "pitch:\n"
                    + "roll:\n"
                    + "speed:\n");

                // Col 2 labels
                g.DrawString(gameStateText.ToString(), SystemFonts.DefaultFont, brush, currX += 275, currY);
                gameStateText.Clear();


                // Calculate derivatives:
                var yaw = Math.Atan2(playerVeh.mOri[RowZ].x, playerVeh.mOri[RowZ].z);

                var pitch = Math.Atan2(-playerVeh.mOri[RowY].z,
                                       Math.Sqrt(playerVeh.mOri[RowX].z * playerVeh.mOri[RowX].z + playerVeh.mOri[RowZ].z * playerVeh.mOri[RowZ].z));

                var roll = Math.Atan2(playerVeh.mOri[RowY].x,
                                      Math.Sqrt(playerVeh.mOri[RowX].x * playerVeh.mOri[RowX].x + playerVeh.mOri[RowZ].x * playerVeh.mOri[RowZ].x));

                var speed = Math.Sqrt((playerVeh.mLocalVel.x * playerVeh.mLocalVel.x)
                                      + (playerVeh.mLocalVel.y * playerVeh.mLocalVel.y)
                                      + (playerVeh.mLocalVel.z * playerVeh.mLocalVel.z));

                // Estimate lapdist
                // See how much ahead telemetry is ahead of scoring update
                var delta            = playerVeh.mElapsedTime - scoring.mScoringInfo.mCurrentET;
                var lapDistEstimated = playerVehScoring.mLapDist;
                if (delta > 0.0)
                {
                    var localZAccelEstimated = playerVehScoring.mLocalAccel.z * delta;
                    var localZVelEstimated   = playerVehScoring.mLocalVel.z + localZAccelEstimated;

                    lapDistEstimated = playerVehScoring.mLapDist - localZVelEstimated * delta;
                }

                gameStateText.Append(
                    $"{playerVehScoring.mTimeIntoLap:N3}\n"
                    + $"{playerVehScoring.mEstimatedLapTime:N3}\n"
                    + $"{playerVehScoring.mTimeBehindNext:N3}\n"
                    + $"{playerVehScoring.mTimeBehindLeader:N3}\n"
                    + $"{MainForm.GetStringFromBytes(playerVehScoring.mPitGroup)}\n"
                    + $"{playerVehScoring.mLapDist:N3}\n"
                    + $"{lapDistEstimated:N3}\n"
                    + $"{yaw:N3}\n"
                    + $"{pitch:N3}\n"
                    + $"{roll:N3}\n"
                    + string.Format("{0:n3} m/s {1:n4} km/h\n", speed, speed * 3.6));

                // Col2 values
                g.DrawString(gameStateText.ToString(), SystemFonts.DefaultFont, Brushes.Purple, currX + 120, currY);

                if (this.logLightMode)
                {
                    return;
                }

                // Branch of UI choice: origin center or car# center
                // Fix rotation on car of choice or no.
                // Draw axes
                // Scale will be parameter, scale applied last on render to zoom.
                float scale = this.scale;

                var xVeh   = (float)playerVeh.mPos.x;
                var zVeh   = (float)playerVeh.mPos.z;
                var yawVeh = yaw;

                // View center
                var xScrOrigin = this.view.Width / 2.0f;
                var yScrOrigin = this.view.Height / 2.0f;
                if (!this.centerOnVehicle)
                {
                    // Set world origin.
                    g.TranslateTransform(xScrOrigin, yScrOrigin);
                    this.RenderOrientationAxis(g);
                    g.ScaleTransform(scale, scale);

                    RenderCar(g, xVeh, -zVeh, -(float)yawVeh, Brushes.Green);

                    for (int i = 0; i < this.telemetry.mNumVehicles; ++i)
                    {
                        if (i == resolvedPlayerIdx)
                        {
                            continue;
                        }

                        var veh     = this.telemetry.mVehicles[i];
                        var thisYaw = Math.Atan2(veh.mOri[2].x, veh.mOri[2].z);
                        this.RenderCar(g,
                                       (float)veh.mPos.x,
                                       -(float)veh.mPos.z,
                                       -(float)thisYaw, Brushes.Red);
                    }
                }
                else
                {
                    g.TranslateTransform(xScrOrigin, yScrOrigin);

                    if (this.rotateAroundVehicle)
                    {
                        g.RotateTransform(180.0f + (float)yawVeh * DEGREES_IN_RADIAN);
                    }

                    this.RenderOrientationAxis(g);
                    g.ScaleTransform(scale, scale);
                    g.TranslateTransform(-xVeh, zVeh);

                    RenderCar(g, xVeh, -zVeh, -(float)yawVeh, Brushes.Green);

                    for (int i = 0; i < this.telemetry.mNumVehicles; ++i)
                    {
                        if (i == resolvedPlayerIdx)
                        {
                            continue;
                        }

                        var veh     = this.telemetry.mVehicles[i];
                        var thisYaw = Math.Atan2(veh.mOri[2].x, veh.mOri[2].z);
                        this.RenderCar(g,
                                       (float)veh.mPos.x,
                                       -(float)veh.mPos.z,
                                       -(float)thisYaw, Brushes.Red);
                    }
                }
            }
        }
Exemple #19
0
        public void ReadData()
        {
            rF2VehicleScoring   playerScoring   = GetPlayerScoring(ref scoring);
            rF2VehicleTelemetry playerTelemetry = GetPlayerTelemetry(playerScoring.mID, ref telemetry);

            string session = "";

            Console.WriteLine("[Session Data]");
            Console.Write("Active="); Console.WriteLine((connected && (extended.mSessionStarted != 0)) ? "true" : "false");
            if (connected)
            {
                if (playerTelemetry.mWheels == null)
                {
                    Console.WriteLine("Paused=true");
                }
                else
                {
                    Console.Write("Paused=");
                    Console.WriteLine(scoring.mScoringInfo.mGamePhase <= (byte)GridWalk || scoring.mScoringInfo.mGamePhase == (byte)PausedOrHeartbeat ? "true" : "false");
                }

                if (scoring.mScoringInfo.mSession >= 10 && scoring.mScoringInfo.mSession <= 13)
                {
                    session = "Race";
                }
                else if (scoring.mScoringInfo.mSession >= 0 && scoring.mScoringInfo.mSession <= 4)
                {
                    session = "Practice";
                }
                else if (scoring.mScoringInfo.mSession >= 5 && scoring.mScoringInfo.mSession <= 8)
                {
                    session = "Qualification";
                }
                else
                {
                    session = "Other";
                }

                Console.Write("Session="); Console.WriteLine(session);

                string vehicleClass = GetStringFromBytes(playerScoring.mVehicleClass);
                string vehicleName  = GetStringFromBytes(playerScoring.mVehicleName);

                Console.Write("Car="); Console.WriteLine(GetCarName(vehicleClass, vehicleName));
                Console.Write("CarName="); Console.WriteLine(vehicleName);
                Console.Write("CarClass="); Console.WriteLine(vehicleClass);
                Console.Write("Track="); Console.WriteLine(GetStringFromBytes(playerTelemetry.mTrackName));
                Console.Write("SessionFormat="); Console.WriteLine((scoring.mScoringInfo.mEndET < 0.0) ? "Lap" : "Time");
                Console.Write("FuelAmount="); Console.WriteLine(Math.Round(playerTelemetry.mFuelCapacity));

                if (session == "Practice")
                {
                    Console.WriteLine("SessionTimeRemaining=3600000");

                    Console.WriteLine("SessionLapsRemaining=30");
                }
                else
                {
                    long time = GetRemainingTime(ref playerScoring);

                    Console.Write("SessionTimeRemaining="); Console.WriteLine(time);

                    Console.Write("SessionLapsRemaining="); Console.WriteLine(GetRemainingLaps(ref playerScoring));
                }
            }

            Console.WriteLine("[Stint Data]");
            if (connected)
            {
                Console.Write("DriverForname="); Console.WriteLine(GetForname(scoring.mScoringInfo.mPlayerName));
                Console.Write("DriverSurname="); Console.WriteLine(GetSurname(scoring.mScoringInfo.mPlayerName));
                Console.Write("DriverNickname="); Console.WriteLine(GetNickname(scoring.mScoringInfo.mPlayerName));

                Console.Write("LapValid="); Console.WriteLine((playerScoring.mCountLapFlag > 0) ? "true" : "false");

                Console.Write("LapLastTime="); Console.WriteLine(Math.Round(Normalize(playerScoring.mLastLapTime) * 1000));
                Console.Write("LapBestTime="); Console.WriteLine(Math.Round(Normalize(playerScoring.mBestLapTime) * 1000));

                Console.Write("Sector="); Console.WriteLine(playerScoring.mSector == 0 ? 3 : playerScoring.mSector);
                Console.Write("Laps="); Console.WriteLine(playerScoring.mTotalLaps);

                if (session == "Practice")
                {
                    Console.WriteLine("StintTimeRemaining=3600000");
                    Console.WriteLine("DriverTimeRemaining=3600000");
                }
                else
                {
                    long time = GetRemainingTime(ref playerScoring);

                    Console.Write("StintTimeRemaining="); Console.WriteLine(time);
                    Console.Write("DriverTimeRemaining="); Console.WriteLine(time);
                }
                Console.Write("InPit="); Console.WriteLine(playerScoring.mPitState == (byte)Stopped ? "true" : "false");
            }

            Console.WriteLine("[Car Data]");
            if (connected && (playerTelemetry.mWheels != null))
            {
                Console.WriteLine("MAP=n/a");
                Console.Write("TC="); Console.WriteLine(extended.mPhysics.mTractionControl);
                Console.Write("ABS="); Console.WriteLine(extended.mPhysics.mAntiLockBrakes);

                Console.Write("FuelRemaining="); Console.WriteLine(playerTelemetry.mFuel);
                Console.Write("TyreTemperature=");
                Console.WriteLine(GetCelcius(playerTelemetry.mWheels[0].mTireCarcassTemperature) + "," +
                                  GetCelcius(playerTelemetry.mWheels[1].mTireCarcassTemperature) + "," +
                                  GetCelcius(playerTelemetry.mWheels[2].mTireCarcassTemperature) + "," +
                                  GetCelcius(playerTelemetry.mWheels[3].mTireCarcassTemperature));
                Console.Write("TyrePressure=");
                Console.WriteLine(GetPsi(playerTelemetry.mWheels[0].mPressure) + "," +
                                  GetPsi(playerTelemetry.mWheels[1].mPressure) + "," +
                                  GetPsi(playerTelemetry.mWheels[2].mPressure) + "," +
                                  GetPsi(playerTelemetry.mWheels[3].mPressure));
                Console.Write("TyreWear=");
                if (extended.mPhysics.mTireMult > 0)
                {
                    Console.WriteLine((100 - Math.Round(playerTelemetry.mWheels[0].mWear * 100)) + "," +
                                      (100 - Math.Round(playerTelemetry.mWheels[1].mWear * 100)) + "," +
                                      (100 - Math.Round(playerTelemetry.mWheels[2].mWear * 100)) + "," +
                                      (100 - Math.Round(playerTelemetry.mWheels[3].mWear * 100)));
                }
                else
                {
                    Console.WriteLine("0,0,0,0");
                }
                Console.Write("BrakeTemperature=");
                Console.WriteLine(GetCelcius(playerTelemetry.mWheels[0].mBrakeTemp) + "," +
                                  GetCelcius(playerTelemetry.mWheels[1].mBrakeTemp) + "," +
                                  GetCelcius(playerTelemetry.mWheels[2].mBrakeTemp) + "," +
                                  GetCelcius(playerTelemetry.mWheels[3].mBrakeTemp));

                string compound = GetStringFromBytes(playerTelemetry.mFrontTireCompoundName);

                Console.Write("TyreCompoundRaw="); Console.WriteLine(compound);

                Console.Write("BodyworkDamage=0, 0, 0, 0, "); Console.WriteLine(extended.mTrackedDamages[playerTelemetry.mID].mAccumulatedImpactMagnitude / 1000);
                Console.WriteLine("SuspensionDamage=0, 0, 0, 0");
                Console.WriteLine("EngineDamage=0");
            }

            Console.WriteLine("[Track Data]");

            if (connected)
            {
                Console.WriteLine("Grip=Optimum");
                Console.Write("Temperature="); Console.WriteLine(scoring.mScoringInfo.mTrackTemp);

                for (int i = 0; i < scoring.mScoringInfo.mNumVehicles; ++i)
                {
                    var vehicle = scoring.mVehicles[i];

                    Console.WriteLine("Car." + (i + 1) + ".Position=" + vehicle.mPos.x + "," + (-vehicle.mPos.z));
                }
            }

            Console.WriteLine("[Weather Data]");

            if (connected)
            {
                Console.Write("Temperature="); Console.WriteLine(scoring.mScoringInfo.mAmbientTemp);

                string theWeather = GetWeather(scoring.mScoringInfo.mDarkCloud, scoring.mScoringInfo.mRaining);

                Console.Write("Weather="); Console.WriteLine(theWeather);
                Console.Write("Weather10Min="); Console.WriteLine(theWeather);
                Console.Write("Weather30Min="); Console.WriteLine(theWeather);
            }

            Console.WriteLine("[Test Data]");
            if (connected)
            {
                Console.Write("Category="); Console.Write(pitInfo.mPitMenu.mCategoryIndex);
                Console.Write(" -> "); Console.WriteLine(GetStringFromBytes(pitInfo.mPitMenu.mCategoryName));
                Console.Write("Choices="); Console.Write(pitInfo.mPitMenu.mChoiceIndex);
                Console.Write(" -> "); Console.WriteLine(GetStringFromBytes(pitInfo.mPitMenu.mChoiceString));
                Console.Write("NumChoices="); Console.WriteLine(pitInfo.mPitMenu.mNumChoices);
            }
        }