private void UpdateData(Ets2Telemetry data, bool updated) { try { if (data != null) { if (this.InvokeRequired) { this.Invoke(new TelemetryData(UpdateData), new object[2] { data, updated }); return; } UpdateDamage(data); if (data.Job.OnJob) { if ((int)data.Physics.SpeedKmh > maxSpeed) { maxSpeed = (int)data.Physics.SpeedKmh; } avgFuelConsumption = data.Drivetrain.FuelAvgConsumption; if (data.Paused) { string oldJobId = save.GetLastJobId(); save.UpdateAllSavedValues(true); string newJobId = save.GetLastJobId(); if (newJobId != oldJobId) { TelemetryOnJobFinished(null, null); maxSpeed = 0; avgFuelConsumption = 0; } } } } } catch { } }
private void Telemetry_Data(Ets2Telemetry data, bool updated) { try { if (this.InvokeRequired) { this.BeginInvoke(new TelemetryData(Telemetry_Data), new object[2] { data, updated }); return; } /*var dataToIno = data.Physics; * var PitchRotation = data.Physics.RotationY; * var RollRotation = data.Physics.RotationZ;*/ pitch_rotation = data.Physics.RotationY; //roll_rotation = data.Physics.RotationZ; /* * Heading: valor-> (0.0 .. 1.0) representa-> (0 .. 360) * Pitching: valor-> (-0.25 .. 0.25) representa-> (-90 .. 90) * Roll: valor-> (-0.5 .. 0.5) representa-> (-180 .. 180) */ /*label2.Text = String.Format("{0:N1}", dataToIno.RotationX * 360.0); * label3.Text = String.Format("{0:N1}", dataToIno.RotationY * 360.0); * label5.Text = String.Format("{0:N1}", dataToIno.RotationZ * 360.0);*/ /* * _serialPort.WriteLine("RotationX:"); * _serialPort.WriteLine(String.Format("{0:N0}", dataToIno.RotationX)); * _serialPort.WriteLine("RotationY:"); * _serialPort.WriteLine(String.Format("{0:N0}", dataToIno.RotationY)); * _serialPort.WriteLine("RotationZ:"); * _serialPort.WriteLine(String.Format("{0:N0}", dataToIno.RotationZ)); */ } catch { } }
/// <summary> /// Constructor /// </summary> /// <param name="name">Name</param> /// <param name="posX">Position X</param> /// <param name="posY">Position Y</param> public UserData(string name, Ets2Telemetry telemetryData, TruckingVSAPI api) { this.name = name; runningGame = Utils.RunningGame; posX = telemetryData.Physics.CoordinateX; posY = telemetryData.Physics.CoordinateY; posZ = telemetryData.Physics.CoordinateZ; speed = telemetryData.Drivetrain.Speed; speedLimit = telemetryData.Job.SpeedLimit; manufacturer = telemetryData.Manufacturer; truck = telemetryData.Truck; onJob = telemetryData.Job.OnJob; cargo = telemetryData.Job.Cargo; companySource = telemetryData.Job.CompanySource; citySource = telemetryData.Job.CitySource; companyDestination = telemetryData.Job.CompanyDestination; cityDestination = telemetryData.Job.CityDestination; navigationDistanceLeft = telemetryData.Job.NavigationDistanceLeft; distance = api.Distance; navigationTimeLeft = telemetryData.Job.NavigationTimeLeft; income = telemetryData.Job.Income; mass = telemetryData.Job.Mass; }
private void Telemetry_Data(Ets2Telemetry data, bool updated) { try { if (this.InvokeRequired) { this.Invoke(new TelemetryData(Telemetry_Data), new object[2] { data, updated }); return; } ets2data = data; coordinates = new Coordinates(data.Physics.CoordinateX, data.Physics.CoordinateY, data.Physics.CoordinateZ); locationLabel.Text = coordinates.X + "; " + coordinates.Y + "; " + coordinates.Z; if (data.Version.Ets2Major == 0) { statusLabel.Text = simulatorNotRunning; statusLabel.ForeColor = Color.Red; } else if (data.Time == 0) { statusLabel.Text = simulatorNotDriving; statusLabel.ForeColor = Color.DarkOrange; } else { statusLabel.Text = simulatorRunning; statusLabel.ForeColor = Color.DarkGreen; } } catch (Exception ex) { Console.Write(ex.ToString()); } }
private void Telemetry_Data(Ets2Telemetry data, bool updated) { if (this.InvokeRequired) { this.Invoke(new TelemetryData(Telemetry_Data), new object[2] { data, updated }); return; } lbGeneral.Text = "General info:\r\n SDK Version: " + data.Version.SdkPlugin + "\r\n Reported game Version: " + data.Version.Ets2Major + "." + data.Version.Ets2Minor + "\r\n\r\nTruck: " + data.Truck + " (" + data.TruckId + ")\r\nManufacturer: " + data.Manufacturer + "(" + data.ManufacturerId + ")" + "\r\nGame Timestamp: " + data.Time + "\r\nPaused? " + data.Paused; // Do some magic trickery to display ALL info: var grps = new object[] { data.Drivetrain, data.Physics, data.Controls, data.Axilliary, data.Damage, data.Lights, data.Job }; foreach (var grp in grps) { // Find the right tab page: var grpName = grp.GetType().Name; if (grpName.StartsWith("_")) { grpName = grpName.Substring(1); } var tabPage = default(TabPage); var tabFound = false; for (int k = 0; k < telemetryInfo.TabCount; k++) { if (telemetryInfo.TabPages[k].Text == grpName) { tabPage = telemetryInfo.TabPages[k]; tabFound = true; } } if (!tabFound) { tabPage = new CustomTabPage(grpName); telemetryInfo.TabPages.Add(tabPage); } // All properties; var props = grp.GetType().GetProperties().OrderBy(x => x.Name); var labels = new StringBuilder(); var vals = new StringBuilder(); foreach (var prop in props) { labels.AppendLine(prop.Name + ":"); vals.AppendLine(prop.GetValue(grp, null).ToString()); } tabPage.Controls.Clear(); var lbl1 = new Label { Location = new Point(3, 3), Size = new Size(200, tabPage.Height - 6) }; var lbl2 = new Label { Location = new Point(203, 3), Size = new Size(200, tabPage.Height - 6) }; lbl1.Text = labels.ToString(); lbl2.Text = vals.ToString(); tabPage.Controls.Add(lbl1); tabPage.Controls.Add(lbl2); } }
/// <summary> /// Constructor /// </summary> public TruckingVSAPIJobData(Ets2Telemetry telemetryData, ETruckingVSAPIJobDataType type) { this.telemetryData = telemetryData; this.type = type; }
/// <summary> /// Update timer tick event /// </summary> /// <param name="sender">Sender</param> /// <param name="e">Event arguments</param> private void updateTimer_Tick(object sender, EventArgs e) { if (takeScreenshot) { takeScreenshot = false; TakeScreenshot(); } if (api != null) { Ets2Telemetry data = telemetryData; if ((data != null) && updateTelemetryData) { bool game_running = Utils.IsAGameRunning && (data.TruckId.Length > 0); dataPanel.Visible = game_running; healthPanel.Visible = game_running; speedPanel.Visible = game_running; speedChart.Visible = game_running; gameNameLabel.Text = Utils.IsAGameRunning ? Utils.RunningGameName : startGameNowTranslated; if (game_running) { speedLabel.Text = (Configuration.UseMetricUnit ? (Math.Round(Math.Abs(data.Drivetrain.SpeedKmh)) + " km/h") : (Math.Round(Math.Abs(data.Drivetrain.SpeedMph)) + " mph")) + (data.Drivetrain.CruiseControl ? ("; " + cruiseControlTranslated + ": " + (Configuration.UseMetricUnit ? (Math.Round(data.Drivetrain.CruiseControlSpeedKmh) + " km/h") : (Math.Round(data.Drivetrain.CruiseControlSpeedMph) + " mph"))) : ""); float delta_speed_limit = data.Drivetrain.Speed - data.Job.SpeedLimit; speedLabel.ForeColor = ((data.Job.SpeedLimit <= 0.0f) ? Color.White : Utils.ColorGradient(Color.White, Color.Red, delta_speed_limit / 1.4f)); speedLimitLabel.Text = speedLimitTranslated + ": " + ((data.Job.SpeedLimit == -1.0f) ? unlimitedTranslated : Math.Round(Utils.ConvertSpeed(data.Job.SpeedLimit)) + (Configuration.UseMetricUnit ? " km/h" : " mph")); vehicleLabel.Text = vehicleTranslated + ": " + data.Manufacturer + " " + data.Truck; if (data.Job.OnJob) { statusLabel.Text = statusTranslated + ": " + deliverCargoTranslated; cargoLabel.Text = cargoTranslated + ": " + data.Job.Cargo; sourceLabel.Text = sourceTranslated + ": " + data.Job.CompanySource + " " + inTranslated + " " + Cities.GetFullCityName(data.Job.CitySource); destinationLabel.Text = destinationTranslated + ": " + data.Job.CompanyDestination + " " + inTranslated + " " + Cities.GetFullCityName(data.Job.CityDestination); routeLabel.Text = routeTranslated + ": " + Utils.HumanReadableLength(Utils.Clamp(api.Distance - data.Job.NavigationDistanceLeft, 0.0f, api.Distance)) + " " + ofTranslated + " " + Utils.HumanReadableLength(api.Distance) + " (" + ((api.Distance > float.Epsilon) ? Math.Round(((api.Distance - data.Job.NavigationDistanceLeft) * 100.0f) / api.Distance) : 100.0f) + "%)"; remainingTimeLabel.Text = remainingTimeTranslated + ": " + Utils.HumanReadableTime(data.Job.NavigationTimeLeft); //timeLabel.Text = timeTranslated + ": " + Utils.HumanReadableTime(data.Job.NavigationTimeLeft) + " " + ofTranslated + " " + Utils.HumanReadableTime(api.Time); yieldLabel.Text = yieldTranslated + ": " + data.Job.Income.ToString("N0") + "€"; weightLabel.Text = weightTranslated + ": " + Utils.HumanReadableWeight(data.Job.Mass); deadlineLabel.Text = deadlineTranslated + ": " + ((data.Job.Deadline == -1) ? unlimitedTranslated : deadlineAvailableTranslated); } else { statusLabel.Text = statusTranslated + ": " + idleTranslated; cargoLabel.Text = ""; sourceLabel.Text = ""; destinationLabel.Text = ""; routeLabel.Text = ""; remainingTimeLabel.Text = ""; yieldLabel.Text = ""; weightLabel.Text = ""; deadlineLabel.Text = ""; } totalRouteLabel.Text = totalRouteTranslated + ": " + Utils.HumanReadableLength(totalRoute); totalWeightLabel.Text = totalWeightTranslated + ": " + Utils.HumanReadableWeight(totalWeight); totalYieldLabel.Text = totalYieldTranslated + ": " + totalYield + "€"; cabinLabel.Text = cabinTranslated + ": " + Math.Round(data.Damage.WearCabin * 100.0f) + "%"; chassisLabel.Text = chassisTranslated + ": " + Math.Round(data.Damage.WearChassis * 100.0f) + "%"; engineLabel.Text = engineTranslated + ": " + Math.Round(data.Damage.WearEnigne * 100.0f) + "%"; transmissionLabel.Text = transmissionTranslated + ": " + Math.Round(data.Damage.WearTransmission * 100.0f) + "%"; wheelsLabel.Text = wheelsTranslated + ": " + Math.Round(data.Damage.WearWheels * 100.0f) + "%"; trailerLabel.Text = (data.Job.TrailerAttached) ? (trailerTranslated + ": " + Math.Round(data.Damage.WearTrailer * 100.0f) + "%") : ""; averageLabel.Text = averageTranslated + ": " + Math.Round((data.Damage.WearCabin + data.Damage.WearChassis + data.Damage.WearEnigne + data.Damage.WearTransmission + data.Damage.WearWheels) * 20.0f) + "%"; float max_damage = Math.Max(data.Damage.WearCabin, Math.Max(data.Damage.WearChassis, Math.Max(data.Damage.WearEnigne, Math.Max(data.Damage.WearTransmission, data.Damage.WearWheels)))); int image_id = 0; if (max_damage >= 0.9f) { image_id = 4; } else if (max_damage >= 0.7f) { image_id = 3; } else if (max_damage >= 0.5f) { image_id = 2; } else if (max_damage >= 0.3f) { image_id = 1; } else if (max_damage >= 0.0f) { image_id = 0; } drivetrainPanel.BackgroundImage = drivetrainImages[image_id]; max_damage = data.Damage.WearTrailer; if (data.Job.TrailerAttached) { if (max_damage >= 0.9f) { image_id = 5; } else if (max_damage >= 0.7f) { image_id = 4; } else if (max_damage >= 0.5f) { image_id = 3; } else if (max_damage >= 0.3f) { image_id = 2; } else if (max_damage >= 0.0f) { image_id = 1; } } else { image_id = 0; } cargoPictureBox.Image = cargoImages[image_id]; double fuel_part = data.Drivetrain.Fuel / (double)(data.Drivetrain.FuelMax); double fuel_percentage = Math.Round(fuel_part * 100.0); fuelLabel.Text = fuelTranslated + ": " + Math.Round(data.Drivetrain.Fuel) + " l " + ofTranslated + " " + Math.Round(data.Drivetrain.FuelMax) + " l (" + Math.Round(data.Drivetrain.FuelAvgConsumption * 100.0f, 2) + " l / 100 km); " + fuel_percentage + "%"; fuelRemainingDistanceLabel.Text = fuelRemainingDistanceTranslated + ": " + Math.Round(data.Drivetrain.FuelRange) + (Configuration.UseMetricUnit ? " km" : " ml"); fuelStatusLabel.Text = fuelStatusTranslated + ": " + ((fuel_percentage <= 15.0) ? pleaseRefillFuelTranslated : (data.Job.OnJob ? ((data.Drivetrain.FuelRange < (data.Job.NavigationDistanceLeft * 0.001f)) ? refillLaterTranslated : enoughFuelTranslated) : ((fuel_percentage < 30.0) ? lowFuelTranslated : enoughFuelTranslated))); fuelStatusLabel.ForeColor = ((fuel_percentage <= 15.0) ? Color.Red : Color.White); if ((currentGameTime != data.Time) && isJobRunning) { currentGameTime = data.Time; ++chartUpdateTickCounter; if ((chartUpdateTickCounter % 400) == 0) { chartUpdateTickCounter = 0; lock (currentSpeedData) { currentSpeedData.Add(Math.Round(Configuration.UseMetricUnit ? data.Drivetrain.SpeedKmh : data.Drivetrain.SpeedMph, 2)); speedChart.Series[0].Points.DataBindY(currentSpeedData); } lock (speedLimitData) { speedLimitData.Add(Math.Abs(Utils.ConvertSpeed((data.Job.SpeedLimit == -1.0f) ? 0.0f : data.Job.SpeedLimit))); speedChart.Series[1].Points.DataBindY(speedLimitData); } } } fuelGaugeNeedlePictureBox.Location = new Point(fuelGaugeNeedleOffset + (int)(fuelGaugeNeedleRange * fuel_part), fuelGaugeNeedlePictureBox.Location.Y); updateTelemetryData = false; } } } }
/// <summary> /// Telemetry data event /// </summary> /// <param name="data">Data</param> /// <param name="newTimestamp">New timestamp</param> private void Telemetry_Data(Ets2Telemetry data, bool newTimestamp) { telemetryData = data; if (api != null) { if (data.Job.OnJob) { DateTime now = DateTime.Now; if (isJobRunning) { if ((now - lastUpdateTimestamp).TotalSeconds >= 60.0) { lastUpdateTimestamp = now; string job_data = GetJobData(data); if (jobData == job_data) { api.QueueJobData(new TruckingVSAPIJobData(data, ETruckingVSAPIJobDataType.DataUpdated)); } else { takeScreenshot = true; ETruckingVSAPIJobDataType api_data_type = ((lastJobDistance <= 2000.0f) ? ETruckingVSAPIJobDataType.Finished : ETruckingVSAPIJobDataType.Canceled); if (api_data_type == ETruckingVSAPIJobDataType.Canceled) { totalRoute -= api.Distance; totalWeight -= api.Weight; totalYield -= api.Yield; } api.QueueJobData(new TruckingVSAPIJobData(data, api_data_type)); lastUpdateTimestamp = now; jobData = job_data; ClearCharts(); totalRoute += data.Job.NavigationDistanceLeft; totalWeight += data.Job.Mass; totalYield += data.Job.Income; api.QueueJobData(new TruckingVSAPIJobData(data, ETruckingVSAPIJobDataType.New)); } } } else { if (data.Job.NavigationDistanceLeft > float.Epsilon) { isJobRunning = true; lastUpdateTimestamp = now; jobData = GetJobData(data); ClearCharts(); totalRoute += data.Job.NavigationDistanceLeft; totalWeight += data.Job.Mass; totalYield += data.Job.Income; api.QueueJobData(new TruckingVSAPIJobData(data, ETruckingVSAPIJobDataType.New)); } } lastJobDistance = data.Job.NavigationDistanceLeft; } else if (isJobRunning) { isJobRunning = false; takeScreenshot = true; ETruckingVSAPIJobDataType api_data_type = ((lastJobDistance <= 2000.0f) ? ETruckingVSAPIJobDataType.Finished : ETruckingVSAPIJobDataType.Canceled); if (api_data_type == ETruckingVSAPIJobDataType.Canceled) { totalRoute -= api.Distance; totalWeight -= api.Weight; totalYield -= api.Yield; } api.QueueJobData(new TruckingVSAPIJobData(data, (lastJobDistance <= 2000.0f) ? ETruckingVSAPIJobDataType.Finished : ETruckingVSAPIJobDataType.Canceled)); } } updateTelemetryData = true; }
/// <summary> /// Get job data /// </summary> /// <param name="telemetryData">Telemetry data</param> /// <returns>Job data</returns> private string GetJobData(Ets2Telemetry telemetryData) { return(telemetryData.Job.Cargo + ";" + telemetryData.Job.CitySource + ";" + telemetryData.Job.CityDestination + ";" + telemetryData.Job.Mass); }
private void Telemetry_Data(Ets2Telemetry data, bool updated) { if (this.InvokeRequired) { this.Invoke(new TelemetryData(Telemetry_Data), new object[2] { data, updated }); return; } VelocidadeAtual = data.Drivetrain.SpeedKmh; IDCarreta = data.Job.TrailerId; #region Informações Iniciais if (ObterInformacoesIniciais) { v_OdometroInical = data.Drivetrain.TruckOdometer; informacoesFrete.CidadeInicial = data.Job.CitySource.ToString(); informacoesFrete.CidadeDestino = data.Job.CityDestination.ToString(); informacoesFrete.Carga = String.Format("{0} {1}t", data.Job.TrailerName.ToString(), (data.Job.Mass / 1000).ToString()); ObterInformacoesIniciais = false; timerTs3.Enabled = true; IDCarretaInicio = data.Job.TrailerId; Lbl_Destino.Text = data.Job.CityDestination; Lbl_Partida.Text = data.Job.CitySource; SetarIconeDasEmpresas(data.Job.CompanySource, data.Job.CompanyDestination); } #endregion #region Informações Finais if (data.Job.TrailerAttached && (cargaEntregue == false) && data.Job.NavigationDistanceLeft < 100 && data.Job.NavigationDistanceLeft >= 10) { informacoesFrete.KmRodado = Convert.ToUInt32(data.Drivetrain.TruckOdometer - v_OdometroInical); informacoesFrete.IdMotorista = IDMotorista; informacoesFrete.Pontuacao = informacoesFrete.CalcularPontuacao(Convert.ToDouble(data.Damage.WearTrailer), controleDeMultas.ObterNumeroDeMultas()); informacoesFrete.Dano = data.Damage.WearTrailer * 100; informacoesFrete.Pontuacao = Math.Round(informacoesFrete.Pontuacao, 1); //informacoesFrete.ListaDeMultas = controleDeMultas.ObterListaDeMultas(); cargaEntregue = true; FinaliziarFrete(); Lbl_Destino.Text = String.Empty; Lbl_Partida.Text = String.Empty; } #endregion #region Controle imagem do caminhao carregado ou descarregado if (data.Job.TrailerAttached) { PicCarga.Image = Properties.Resources.Carregado; } else { PicCarga.Image = Properties.Resources.Descarregado; } #endregion #region Label Velocidade e Distancia Lbl_InfoGame.Text = String.Format("Velocidade {0} km/h Distância {1} km", VelocidadeAtual.ToString("0"), (data.Job.NavigationDistanceLeft / 1000).ToString("0")); #endregion }
private void Telemetry_Data(Ets2Telemetry data, bool updated) { try { if (this.InvokeRequired) { this.Invoke(new TelemetryData(Telemetry_Data), new object[2] { data, updated }); return; } lbGeneral.Text = "General info:\r\n SDK Version: " + data.Version.SdkPlugin + "\r\n Reported game Version: " + data.Version.Ets2Major + "." + data.Version.Ets2Minor + "\r\n\r\nTruck: " + data.Truck + " (" + data.TruckId + ")\r\nManufacturer: " + data.Manufacturer + "(" + data.ManufacturerId + ")" + "\r\nGame Timestamp: " + data.Time + "\r\nPaused? " + data.Paused; // Do some magic trickery to display ALL info: var grps = new object[] { data.Drivetrain, data.Physics, data.Controls, data.Axilliary, data.Damage, data.Lights, data.Job }; foreach (var grp in grps) { // Find the right tab page: var grpName = grp.GetType().Name; if (grpName.StartsWith("_")) grpName = grpName.Substring(1); var tabPage = default(TabPage); var tabFound = false; for (int k = 0; k < telemetryInfo.TabCount; k++) { if (telemetryInfo.TabPages[k].Text == grpName) { tabPage = telemetryInfo.TabPages[k]; tabFound = true; } } if (!tabFound) { tabPage = new CustomTabPage(grpName); telemetryInfo.TabPages.Add(tabPage); } // All properties; var props = grp.GetType().GetProperties().OrderBy(x => x.Name); var labels = new StringBuilder(); var vals = new StringBuilder(); foreach (var prop in props) { labels.AppendLine(prop.Name + ":"); object val = prop.GetValue(grp, null); if (val is float[]) { vals.AppendLine(string.Join(", ", (val as float[]).Select(x=> x.ToString("0.000")))); } else { vals.AppendLine(val.ToString()); } } tabPage.Controls.Clear(); var lbl1 = new Label { Location = new Point(3, 3), Size = new Size(200, tabPage.Height - 6) }; var lbl2 = new Label { Location = new Point(203, 3), Size = new Size(1000, tabPage.Height - 6) }; lbl1.Text = labels.ToString(); lbl2.Text = vals.ToString(); lbl2.AutoSize = false; tabPage.Controls.Add(lbl1); tabPage.Controls.Add(lbl2); } } catch { } }
private void Telemetry_Data(Ets2Telemetry _data, bool updated) { try { if (speedTestFlag == 1) { if (_data.Drivetrain.SpeedKmh > 100.0000) { var result = stoptimer.ElapsedMilliseconds; Dispatcher.Invoke(() => { listBox.Items.Add("0-100km/h\t" + (result / 1000.0) + "s"); listBox.SelectedIndex = listBox.Items.Count - 1; }); speedTestFlag = 2; } else if (stoptimer.ElapsedMilliseconds > 1500 && _data.Drivetrain.SpeedKmh < 0.2) { speedTestFlag = 0; } } else if (speedTestFlag == 2) { if (_data.Drivetrain.SpeedKmh > 200.0000) { var result = stoptimer.ElapsedMilliseconds; Dispatcher.Invoke(() => { listBox.Items.Add("0-200km/h\t" + (result / 1000.0) + "s"); listBox.SelectedIndex = listBox.Items.Count - 1; }); speedTestFlag = 3; } else if (stoptimer.ElapsedMilliseconds > 1500 && _data.Drivetrain.SpeedKmh < 0.2) { speedTestFlag = 0; } } else if (speedTestFlag == 3) { if (_data.Drivetrain.SpeedKmh < 0.2) { speedTestFlag = 0; //Dispatcher.Invoke(() => listBox.Items.Add("stop")); } } else { if (_data.Drivetrain.SpeedKmh > 0.2000) { stoptimer.Reset(); stoptimer.Start(); //Dispatcher.Invoke(() => listBox.Items.Add("start")); speedTestFlag = 1; } } Dispatcher.Invoke(() => { var speed = _data.Drivetrain.SpeedKmh; if (speed < 0) { speed *= -1; } speedLabel.Content = speed.ToString("0"); speedDecimalLabel.Content = (int)((speed - (int)speed) * 10); brakeTempLabel.Content = _data.Drivetrain.BrakeTemperature; if (_data.Drivetrain.Gear < 0) { gearLabel.Content = "R" + (_data.Drivetrain.Gear * -1); } else if (_data.Drivetrain.Gear == 0) { gearLabel.Content = "N"; } else { gearLabel.Content = _data.Drivetrain.Gear; } rpm = rpm * 0.9 + _data.Drivetrain.EngineRpm * 0.1; if (rpm < 1200) { rpmBar.Value = rpmBar.Minimum; } else if (rpm > 3000) { rpmBar.Value = rpmBar.Maximum; } else { rpmBar.Value = rpm; } rpmLabel.Content = rpm.ToString("0"); if (rpm > 2300) { shiftIndicator.Fill = Brushes.Red; } else if (rpm < 1500) { shiftIndicator.Fill = Brushes.Blue; } else { shiftIndicator.Fill = Brushes.White; } rpmList.Add(new Tuple <ulong, double>(chartCnt, rpm)); seriesRpm.Points.Clear(); foreach (var x in rpmList.Skip(Math.Max(0, rpmList.Count - 200))) { seriesRpm.Points.AddXY(x.Item1, x.Item2); } chartCnt++; }); } catch { } }