private void LoadShiftPattern(string pattern, string file) { // Add pattern if not existing. if (!ShiftPatterns.ContainsKey(pattern)) { ShiftPatterns.Add(pattern, new ShiftPattern()); } // Load configuration file Main.Load(ShiftPatterns[pattern], "Settings/ShiftPattern/" + file + ".ini"); }
public void TickTelemetry(IDataMiner data) { if (!Main.Data.Active.SupportsCar) { return; } bool wasCalibrating = Calibrating; Calibrating = !Main.Drivetrain.Calibrated; if (!wasCalibrating && Calibrating) { Debug.WriteLine("now calibrating"); stage = DrivetrainCalibrationStage.StartIdleRpm; } if (stage != DrivetrainCalibrationStage.None && !Calibrating) { stage = DrivetrainCalibrationStage.None; } ; switch (stage) { case DrivetrainCalibrationStage.None: reqGears = false; reqThrottle = false; reqClutch = false; break; case DrivetrainCalibrationStage.StartIdleRpm: reqClutch = true; reqThrottle = true; reqGears = true; Main.Transmission.Shift(data.Telemetry.Gear, 0, calibrateShiftStyle); if (data.Telemetry.EngineRpm < 300) { throttle = 1; clutch = 1; gear = 0; } else if (data.Telemetry.EngineRpm > 2000) { throttle = 0; clutch = 1; gear = 0; } else { throttle = 0; clutch = 1; gear = 0; if (Math.Abs(data.Telemetry.EngineRpm - previousEngineRpm) < 1) { stage = DrivetrainCalibrationStage.FinishIdleRpm; MeasurementSettletime = DateTime.Now.Add(new TimeSpan(0, 0, 0, 0, 2750)); } } previousEngineRpm = data.Telemetry.EngineRpm; break; case DrivetrainCalibrationStage.FinishIdleRpm: if (MeasurementSettled) { Debug.WriteLine("Idle RPM: " + data.Telemetry.EngineRpm); if (data.Telemetry.EngineRpm < 300) { stage = DrivetrainCalibrationStage.StartIdleRpm; } else { Main.Drivetrain.StallRpm = data.Telemetry.EngineRpm; stage = DrivetrainCalibrationStage.StartMaxRpm; maxRpmTarget = data.Telemetry.EngineRpm + 1000; previousThrottle = 0; } } break; case DrivetrainCalibrationStage.StartMaxRpm: reqClutch = true; reqThrottle = true; reqGears = true; clutch = 1; throttle = 1; maxRpmMeasured = 0; MeasurementSettletime = DateTime.Now.Add(new TimeSpan(0, 0, 0, 0, 1500)); stage = DrivetrainCalibrationStage.FinishMaxRpm; break; case DrivetrainCalibrationStage.FinishMaxRpm: throttle = 1; maxRpmMeasured = Math.Max(maxRpmMeasured, data.Telemetry.EngineRpm); if (MeasurementSettled) { if (Math.Abs(maxRpmMeasured - Main.Drivetrain.StallRpm) < 500) { Debug.WriteLine("Totally messed up MAX RPM.. resetting"); stage = DrivetrainCalibrationStage.StartIdleRpm; } else { Debug.WriteLine("Max RPM approx: " + maxRpmMeasured); Main.Drivetrain.MaximumRpm = maxRpmMeasured - 300; stage = DrivetrainCalibrationStage.ShiftToFirst; nextStage = DrivetrainCalibrationStage.StartGears; } } break; case DrivetrainCalibrationStage.StartGears: reqClutch = true; reqThrottle = true; reqGears = true; throttle = 0; clutch = 1; gear++; Main.Transmission.Shift(data.Telemetry.Gear, gear, calibrateShiftStyle); MeasurementSettletime = DateTime.Now.Add(new TimeSpan(0, 0, 0, 0, 500)); stage = DrivetrainCalibrationStage.FinishGears; break; case DrivetrainCalibrationStage.FinishGears: if (MeasurementSettled && !Main.Transmission.IsShifting) { if (data.Telemetry.Gear != gear) { gear--; // Car doesn't have this gear. Debug.WriteLine("Gears: " + gear); if (gear <= 0) { Debug.WriteLine("That's not right"); stage = DrivetrainCalibrationStage.StartGears; } else { Main.Drivetrain.Gears = gear; Main.Drivetrain.GearRatios = new double[gear]; stage = DrivetrainCalibrationStage.ShiftToFirst; nextStage = DrivetrainCalibrationStage.StartGearRatios; MeasurementSettletime = DateTime.Now.Add(new TimeSpan(0, 0, 0, 0, 500)); calibrationPreDone = false; } gear = 0; } else { stage = DrivetrainCalibrationStage.StartGears; } } break; case DrivetrainCalibrationStage.ShiftToFirst: if (!Main.Transmission.IsShifting && MeasurementSettled) { if (data.Telemetry.Gear != 1) { Main.Transmission.Shift(shiftToFirstRangeAttempt * Main.Transmission.RangeSize + 1, 1, calibrateShiftStyle); shiftToFirstRangeAttempt++; MeasurementSettletime = DateTime.Now.Add(new TimeSpan(0, 0, 0, 0, 100)); if (shiftToFirstRangeAttempt > 3) { shiftToFirstRangeAttempt = 0; } } else { stage = nextStage; MeasurementSettletime = DateTime.MaxValue; } } break; case DrivetrainCalibrationStage.EndGearRatios: if (Main.Drivetrain.GearRatios.Length >= data.Telemetry.Gear) { if (data.Telemetry.Gear <= 0) { stage = DrivetrainCalibrationStage.StartGearRatios; break; } if (data.Telemetry.EngineRpm > Main.Drivetrain.StallRpm * 1.15) { var gr = Main.Drivetrain.GearRatios[data.Telemetry.Gear - 1]; if (gr != 0) { stage = DrivetrainCalibrationStage.StartGearRatios; break; } reqThrottle = true; throttle = gearRatioSpeedCruise - data.Telemetry.Speed; throttle /= 3; var ratio = data.Telemetry.EngineRpm / (3.6 * data.Telemetry.Speed); if (ratio > 1000 || ratio < 1) { stage = DrivetrainCalibrationStage.StartGearRatios; break; } Debug.WriteLine("Gear " + data.Telemetry.Gear + " : " + ratio); // start sampling if (sample == 0) { sample = ratio; } else { sample = sample * 0.9 + ratio * 0.1; } samplesTaken++; if (samplesTaken == 50) { Main.Drivetrain.GearRatios[data.Telemetry.Gear - 1] = sample; } } else { stage = DrivetrainCalibrationStage.StartGearRatios; break; } } else { stage = DrivetrainCalibrationStage.StartGearRatios; } break; case DrivetrainCalibrationStage.StartGearRatios: reqGears = false; reqThrottle = false; reqClutch = false; // Activate get-home-mode; which shifts at 4x stall rpm Main.Transmission.GetHomeMode = true; if (data.Telemetry.EngineRpm > Main.Drivetrain.StallRpm * 2) { // Driving at reasonable rpm's. if (data.Telemetry.Gear > 0) { if (Main.Drivetrain.GearRatios.Length >= data.Telemetry.Gear && data.Telemetry.EngineRpm > Main.Drivetrain.StallRpm * 2) { var gr = Main.Drivetrain.GearRatios[data.Telemetry.Gear - 1]; if (gr == 0) { samplesTaken = 0; gearRatioSpeedCruise = data.Telemetry.Speed; stage = DrivetrainCalibrationStage.EndGearRatios; } } } var GearsCalibrated = true; for (int i = 0; i < Main.Drivetrain.Gears; i++) { if (Main.Drivetrain.GearRatios[i] < 1) { UncalibratedGear = i; GearsCalibrated = false; } } if (GearsCalibrated) { if (MeasurementSettled) { Main.Transmission.GetHomeMode = false; Debug.WriteLine("Calibration done"); stage = DrivetrainCalibrationStage.None; Main.Store(Main.Drivetrain.ExportParameters(), Main.Drivetrain.File); Main.Load(Main.Drivetrain, Main.Drivetrain.File); } if (!calibrationPreDone) { calibrationPreDone = true; MeasurementSettletime = DateTime.Now.Add(new TimeSpan(0, 0, 0, 3)); } } } break; } }
public void TickTelemetry(IDataMiner data) { var acc = (data.Telemetry.Speed - previousSpeed) / (DateTime.Now.Subtract(previousTime).TotalMilliseconds / 1000); var pullSpeed = Main.Drivetrain.CalculateSpeedForRpm(data.Telemetry.Gear - 1, data.Telemetry.EngineRpm); LaunchControlActive = state != LaunchControlState.Inactive; switch (state) { case LaunchControlState.Inactive: break; case LaunchControlState.Waiting: _outThrottle = 0; _outClutch = 1; break; case LaunchControlState.Revving: _outThrottle = RevvingProp - RevvingProp * data.Telemetry.EngineRpm / LaunchRpm; _outClutch = 1; revvedUp = Math.Abs(data.Telemetry.EngineRpm - LaunchRpm) < 300; break; case LaunchControlState.Pulling: _outThrottle = PullingThrottleProp - PullingThrottleProp * data.Telemetry.EngineRpm / LaunchRpm; _outClutch = 1 - PullingClutchProp * previousAcc / PeakAcceleration; if (_outClutch > 0.8) { _outClutch = 0.8; } if (data.Telemetry.EngineRpm - 300 > LaunchRpm) { state = LaunchControlState.Slipping; } break; case LaunchControlState.Slipping: // revving is less harder to do than pulling // so we switch back to the revving settings, and when the wheelspin is over we go back. _outThrottle = RevvingProp - RevvingProp * data.Telemetry.EngineRpm / LaunchRpm; _outClutch = 1 - PullingClutchProp * previousAcc / PeakAcceleration; if (_outClutch > 0.8) { _outClutch = 0.8; } if (data.Telemetry.EngineRpm < LaunchRpm) { state = LaunchControlState.Pulling; } break; } if (TemporaryLoadTc) { if (!tcLoaded && data.Telemetry.Gear == 1 && LaunchControlActive && Main.TractionControl.File.Contains("notc")) { tcLoaded = true; Main.Load(Main.TractionControl, "Settings/TractionControl/launch.ini"); } if (tcLoaded && data.Telemetry.Gear != 1) { tcLoaded = false; Main.Load(Main.TractionControl, "Settings/TractionControl/notc.ini"); } } if (LaunchControlActive && data.Telemetry.Speed > pullSpeed * 0.95) { Debug.WriteLine("Done pulling!"); // We're done pulling state = LaunchControlState.Inactive; } if (_outThrottle > 1) { _outThrottle = 1; } if (_outThrottle < 0) { _outThrottle = 0; } if (_outClutch > 1) { _outClutch = 1; } if (_outClutch < 0) { _outClutch = 0; } previousSpeed = data.Telemetry.Speed; previousTime = DateTime.Now; previousAcc = acc * 0.25 + previousAcc * 0.75; //Debug.WriteLine(previousAcc); }