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(); }
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); }
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(); }
/// <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; }
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(""); } }
void Throw_Exception_When_Copy_To_Null_Dictionary() { var info = new TelemetryInfo <int>(); Check.ThatCode(() => info.CopyTo(null)).Throws <ArgumentNullException>(); }
internal void UpdateLiveInfo(TelemetryInfo e) { this.Live.ParseTelemetry(e); }
public abstract void OnTelemetryUpdated(TelemetryInfo info, double updateTime);
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(); }
public TelemetryInfoProxy(SdkWrapper wrapper, TelemetryInfo telemetryInfo) { this.wrapper = wrapper; this.telemetryInfo = telemetryInfo; }
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; } }
void Throw_Exception_When_Appending_Null_Dictionary() { var info = new TelemetryInfo <int>(); Check.ThatCode(() => info.Append(null)).Throws <ArgumentNullException>(); }
public TelemetryEventArgs(TelemetryInfo info) : base() { TelemetryInfo = info; }
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; } }
internal void UpdatePrivateInfo(TelemetryInfo e) { this.Private.ParseTelemetry(e); }
public void Update(TelemetryInfo telemetry) { this.SessionTime = telemetry.SessionTime.Value; this.TimeRemaining = telemetry.SessionTimeRemain.Value; this.Flags = telemetry.SessionFlags.Value; }
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; } }
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]; }