コード例 #1
0
ファイル: Form1.cs プロジェクト: nervTeh/iRacingSdkWrapper
        private void UpdateDriversTelemetry(TelemetryInfo info)
        {
            // Get your own driver entry
            // This strange " => " syntax is called a lambda expression and is short for a loop through all drivers
            Driver me = drivers.FirstOrDefault(d => d.Id == wrapper.DriverId);

            // Get arrays of the laps, distances, track surfaces of every driver
            var laps          = info.CarIdxLap.Value;
            var lapDistances  = info.CarIdxLapDistPct.Value;
            var trackSurfaces = info.CarIdxTrackSurface.Value;

            // Loop through the list of current drivers
            foreach (Driver driver in drivers)
            {
                // Set the lap, distance, tracksurface belonging to this driver
                driver.Lap          = laps[driver.Id];
                driver.LapDistance  = lapDistances[driver.Id];
                driver.TrackSurface = trackSurfaces[driver.Id];

                // If your own driver exists, use it to calculate the relative distance between you and the other driver
                if (me != null)
                {
                    var relative = driver.LapDistance - me.LapDistance;

                    // If driver is more than half the track behind, subtract 100% track length
                    // and vice versa
                    if (relative > 0.5)
                    {
                        relative -= 1;
                    }
                    else if (relative < -0.5)
                    {
                        relative += 1;
                    }

                    driver.RelativeLapDistance = relative;
                }
                else
                {
                    driver.RelativeLapDistance = -1;
                }
            }

            this.UpdateDriversGrid();
        }
コード例 #2
0
        public void PostTelemetry <T>(
            T input,
            HttpRequest request)
        {
            var ipAddress = request.HttpContext.Connection.RemoteIpAddress?.ToString()
                            ?? "";
            var telemetry = new TelemetryInfo <T>
            {
                ClientIpAddress = ipAddress,
                Input           = input
            };
            var telemetryTextLine = JsonSerializer.Serialize(
                telemetry,
                new JsonSerializerOptions
            {
                PropertyNamingPolicy = JsonNamingPolicy.CamelCase
            });

            _logger.Information(telemetryTextLine);
        }
コード例 #3
0
        private void UpdateDriverTelemetry(TelemetryInfo info)
        {
            // If currently updating list, no need to update telemetry info
            if (_isUpdatingDrivers)
            {
                return;
            }

            if (_driver != null)
            {
                _driver.UpdatePrivateInfo(info);
            }
            foreach (var driver in _drivers)
            {
                driver.Live.CalculateSpeed(info, _sessionData.Track.Length);
                driver.UpdateLiveInfo(info);
                driver.UpdateSectorTimes(_sessionData.Track, info);
            }

            this.CalculateLivePositions();
            this.UpdateTimeDelta();
        }
コード例 #4
0
        /// <summary>
        /// Called when [telemetry updated].
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="e">The <see cref="SdkWrapper.TelemetryUpdatedEventArgs"/> instance containing the event data.</param>
        private void OnTelemetryUpdated(object sender, SdkWrapper.TelemetryUpdatedEventArgs e)
        {
            _ti = e.TelemetryInfo;

            if (_currentSessionNumber == null || (_currentSessionNumber.Value != _ti.SessionNum.Value))
            {
                _forceSessionUpdate = true;
            }

            _currentSessionNumber = _ti.SessionNum.Value;

            if (_ti.IsInGarage.Value == false && _ti.IsOnTrack.Value == false)
            {
                _telemetryData.Car.InCar = false;
            }
            else
            {
                _telemetryData.Car.InCar = true;
            }
            _telemetryData.Engine.RPM        = _ti.RPM.Value;
            _telemetryData.Car.Speed         = ConvertSpeedToMPH(_ti.Speed.Value);
            _telemetryData.Car.Gear          = _ti.Gear.Value;
            _telemetryData.Car.FuelRemaining = _ti.FuelLevel.Value;
            if (_ti.FuelLevelPct.Value != 0)
            {
                _telemetryData.Car.FuelCapacity = (100 / (_ti.FuelLevelPct.Value * 100)) * _ti.FuelLevel.Value;
            }
            else
            {
                _telemetryData.Car.FuelCapacity = 0;
            }

            _telemetryData.Timing.CurrentLapTime = _wrapper.GetTelemetryValue <float>("LapCurrentLapTime").Value;

            _telemetryData.Engine.WaterTemp = _ti.WaterTemp.Value;

            _timingData.RaceInfo.SessionTime = _ti.SessionTime.Value;
        }
コード例 #5
0
        private void printTelemInfo(TelemetryInfo telem)
        {
            if (this.chkTelem.Checked)
            {
                telemTextBox.Clear();

                String gr = "";
                if (telem.Gear.Value == -1)
                {
                    gr = "R";
                }
                else if (telem.Gear.Value == 0)
                {
                    gr = "N";
                }
                else
                {
                    gr = Convert.ToString(telem.Gear.Value);
                }

                telemPrint("Car: " + car);
                telemPrint("Track: " + track);
                telemPrint("");
                telemPrint("Gear: " + gr);
                telemPrint("RPM: " + Math.Round(telem.RPM.Value));
                telemPrint("Speed: " + (this.cboSpdUnit.SelectedIndex == 0 ? Math.Round(telem.Speed.Value * 2.23693629, 1) + "MPH" : Math.Round(telem.Speed.Value * (2.23693629 * 1.609344), 1) + "KPH"));
                telemPrint("Lap: " + telem.Lap.Value);
                telemPrint("Total Flying Laps Completed: " + fuelLaps);
                telemPrint("Fuel PCT: " + telem.FuelLevelPct.Value * 100);
                telemPrint("Fuel Lvl (L): " + telem.FuelLevel.Value);
                telemPrint("Fuel Use on Current Lap (L): " + ((this.prevFuel - telem.FuelLevel.Value) > 0 ? Math.Round(this.prevFuel - telem.FuelLevel.Value, 3) : 0));
                telemPrint("Fuel Use Per Lap Avg(L): " + Math.Round(fuelEst, 5));
                telemPrint("Laps Left EST: " + Math.Round(telem.FuelLevel.Value / fuelEst, 2));
                telemPrint("");
            }
        }
コード例 #6
0
        void Throw_Exception_When_Copy_To_Null_Dictionary()
        {
            var info = new TelemetryInfo <int>();

            Check.ThatCode(() => info.CopyTo(null)).Throws <ArgumentNullException>();
        }
コード例 #7
0
 internal void UpdateLiveInfo(TelemetryInfo e)
 {
     this.Live.ParseTelemetry(e);
 }
コード例 #8
0
 public abstract void OnTelemetryUpdated(TelemetryInfo info, double updateTime);
コード例 #9
0
        private void UpdateDriversTelemetry(TelemetryInfo info)
        {
            // Get your own driver entry
            // This strange " => " syntax is called a lambda expression and is short for a loop through all drivers
            Driver me = drivers.FirstOrDefault(d => d.Id == wrapper.DriverId);

            // Get arrays of the laps, distances, track surfaces of every driver
            var laps = info.CarIdxLap.Value;
            var lapDistances = info.CarIdxLapDistPct.Value;
            var trackSurfaces = info.CarIdxTrackSurface.Value;

            // Loop through the list of current drivers
            foreach (Driver driver in drivers)
            {
                // Set the lap, distance, tracksurface belonging to this driver
                driver.Lap = laps[driver.Id];
                driver.LapDistance = lapDistances[driver.Id];
                driver.TrackSurface = trackSurfaces[driver.Id];

                // If your own driver exists, use it to calculate the relative distance between you and the other driver
                if (me != null)
                {
                    var relative = driver.LapDistance - me.LapDistance;

                    // If driver is more than half the track behind, subtract 100% track length
                    // and vice versa
                    if (relative > 0.5) relative -= 1;
                    else if (relative < -0.5) relative += 1;

                    driver.RelativeLapDistance = relative;
                }
                else
                {
                    driver.RelativeLapDistance = -1;
                }
            }

            this.UpdateDriversGrid();
        }
コード例 #10
0
 public TelemetryInfoProxy(SdkWrapper wrapper, TelemetryInfo telemetryInfo)
 {
     this.wrapper       = wrapper;
     this.telemetryInfo = telemetryInfo;
 }
コード例 #11
0
        public void fetch(TelemetryInfo telem, iRacingSDK sdk, double fuelVal, int brake, Boolean sendTimeReset, Boolean sendTime, double prevFuel)
        {
            Gear     = telem.Gear.Value;
            Speed    = telem.Speed.Value;
            RPM      = Convert.ToInt16(telem.RPM.Value);
            Shift    = telem.ShiftIndicatorPct.Value;
            Lap      = telem.Lap.Value > 199 ? 199 : telem.Lap.Value;
            Engine   = (byte)(Convert.ToString(telem.EngineWarnings.Value).Contains("PitSpeedLimiter") ? 1 : 0);
            DeltaNeg = 0;
            Mins     = 0;

            if (fuelVal != 0)
            {
                double tmp = Math.Round(telem.FuelLevel.Value / fuelVal, 2);
                if (tmp > 99.9)
                {
                    Fuel = Convert.ToInt16(Math.Round(tmp));
                }
                else if (tmp > 9.99)
                {
                    Fuel    = Convert.ToInt16(Math.Round(tmp * 10));
                    Engine |= 1 << 1;
                }
                else
                {
                    Fuel    = Convert.ToInt16(Math.Round(tmp * 100));
                    Engine |= 2 << 1;
                }
            }
            else
            {
                Fuel    = Convert.ToInt16(Math.Round(telem.FuelLevelPct.Value * 100));
                Engine |= 3 << 1;
            }
            Engine |= (byte)(brake << 3);

            if (prevFuel != 0)
            {
                Engine |= (1 << 4);
            }
            if (sendTimeReset)
            {
                Engine |= (1 << 5);
            }

            if (sendTime)
            {
                Engine |= (1 << 6);
                float l = Convert.ToSingle(sdk.GetData("LapLastLapTime"));
                if (l > 0)
                {
                    Mins = Convert.ToInt16(Math.Floor(l / 60));
                    int Secs  = Convert.ToInt16(Math.Floor(l - (Mins * 60)));
                    int mSecs = Convert.ToInt16(Math.Floor((l - (Secs + (Mins * 60))) * 1000));
                    Delta = (Secs << 9) | mSecs;
                }
            }
            else
            {
                Delta = (int)(Math.Round(Convert.ToSingle(sdk.GetData("LapDeltaToBestLap")) * 1000));
                if (Delta <= 0)
                {
                    DeltaNeg = 1;
                    Delta    = Delta * -1;
                }
                Delta = Delta > 9999 ? 9999 : Delta;
            }
        }
コード例 #12
0
        void Throw_Exception_When_Appending_Null_Dictionary()
        {
            var info = new TelemetryInfo <int>();

            Check.ThatCode(() => info.Append(null)).Throws <ArgumentNullException>();
        }
コード例 #13
0
 public TelemetryEventArgs(TelemetryInfo info)
     : base()
 {
     TelemetryInfo = info;
 }
コード例 #14
0
ファイル: Driver.cs プロジェクト: Zuppi/Zuppidash
        public void UpdateSectorTimes(Track track, TelemetryInfo telemetry)
        {
            if (track == null)
            {
                return;
            }
            if (track.Sectors.Count == 0)
            {
                return;
            }

            var results = this.CurrentResults;

            if (results != null)
            {
                var sectorcount = track.Sectors.Count;

                // Set arrays
                if (results.SectorTimes == null || results.SectorTimes.Length == 0)
                {
                    results.SectorTimes = track.Sectors.Select(s => s.Copy()).ToArray();
                }

                var p0 = _prevPos;
                var p1 = telemetry.CarIdxLapDistPct.Value[this.Id];
                var dp = p1 - p0;

                if (p1 < -0.5)
                {
                    // Not in world?
                    return;
                }

                var t = telemetry.SessionTime.Value;

                // Check lap crossing
                if (p0 - p1 > 0.5) // more than 50% jump in track distance == lap crossing occurred from 0.99xx -> 0.00x
                {
                    this.Live.CurrentSector     = 0;
                    this.Live.CurrentFakeSector = 0;
                    p0 -= 1;
                }

                // Check all real sectors
                foreach (var s in results.SectorTimes)
                {
                    if (p1 > s.StartPercentage && p0 <= s.StartPercentage)
                    {
                        // Crossed into new sector
                        var crossTime = (float)(t - (p1 - s.StartPercentage) * dp);

                        // Finish previous
                        var prevNum = s.Number <= 0 ? sectorcount - 1 : s.Number - 1;
                        var sector  = results.SectorTimes[prevNum];
                        if (sector != null && sector.EnterSessionTime > 0)
                        {
                            sector.SectorTime = new Laptime((float)(crossTime - sector.EnterSessionTime));
                        }

                        // Begin next sector
                        s.EnterSessionTime = crossTime;

                        this.Live.CurrentSector = s.Number;

                        break;
                    }
                }

                // Check 'fake' sectors (divide track into thirds)
                sectorcount = 3;
                foreach (var s in results.FakeSectorTimes)
                {
                    if (p1 > s.StartPercentage && p0 <= s.StartPercentage)
                    {
                        // Crossed into new sector
                        var crossTime = (float)(t - (p1 - s.StartPercentage) * dp);

                        // Finish previous
                        var prevNum = s.Number <= 0 ? sectorcount - 1 : s.Number - 1;
                        var sector  = results.FakeSectorTimes[prevNum];
                        if (sector != null && sector.EnterSessionTime > 0)
                        {
                            sector.SectorTime = new Laptime((float)(crossTime - sector.EnterSessionTime));
                        }

                        // Begin next sector
                        s.EnterSessionTime = crossTime;

                        this.Live.CurrentFakeSector = s.Number;

                        break;
                    }
                }

                _prevPos = p1;
            }
        }
コード例 #15
0
ファイル: Driver.cs プロジェクト: Zuppi/Zuppidash
 internal void UpdatePrivateInfo(TelemetryInfo e)
 {
     this.Private.ParseTelemetry(e);
 }
コード例 #16
0
 public void Update(TelemetryInfo telemetry)
 {
     this.SessionTime   = telemetry.SessionTime.Value;
     this.TimeRemaining = telemetry.SessionTimeRemain.Value;
     this.Flags         = telemetry.SessionFlags.Value;
 }
コード例 #17
0
        public void CalculateSpeed(TelemetryInfo current, double?trackLengthKm)
        {
            if (current == null)
            {
                return;
            }
            if (trackLengthKm == null)
            {
                return;
            }

            try
            {
                var t1   = current.SessionTime.Value;
                var t0   = _prevSpeedUpdateTime;
                var time = t1 - t0;

                if (time < SPEED_CALC_INTERVAL)
                {
                    // Ignore
                    return;
                }

                var p1 = current.CarIdxLapDistPct.Value[this.Driver.Id];
                var p0 = _prevSpeedUpdateDist;

                if (p1 < -0.5 || _driver.Live.TrackSurface == TrackSurfaces.NotInWorld)
                {
                    // Not in world?
                    return;
                }

                if (p0 - p1 > 0.5)
                {
                    // Lap crossing
                    p1 += 1;
                }
                var distancePct = p1 - p0;

                var distance = distancePct * trackLengthKm.GetValueOrDefault() * 1000; //meters


                if (time >= Double.Epsilon)
                {
                    this.Speed = distance / (time); // m/s
                }
                else
                {
                    if (distance < 0)
                    {
                        this.Speed = Double.NegativeInfinity;
                    }
                    else
                    {
                        this.Speed = Double.PositiveInfinity;
                    }
                }
                this.SpeedKph = this.Speed * 3.6;

                _prevSpeedUpdateTime = t1;
                _prevSpeedUpdateDist = p1;
            }
            catch (Exception ex)
            {
                //Log.Instance.LogError("Calculating speed of car " + this.Driver.Id, ex);
                this.Speed = 0;
            }
        }
コード例 #18
0
 public void ParseTelemetry(TelemetryInfo e)
 {
     this.Lap          = e.CarIdxLap.Value[this.Driver.Id];
     this.LapDistance  = e.CarIdxLapDistPct.Value[this.Driver.Id];
     this.TrackSurface = e.CarIdxTrackSurface.Value[this.Driver.Id];
 }