diff --git a/src/Devices/AtcDimetronic.cs b/src/Devices/AtcDimetronic.cs index 32428b9..1060fe6 100644 --- a/src/Devices/AtcDimetronic.cs +++ b/src/Devices/AtcDimetronic.cs @@ -84,7 +84,7 @@ namespace OpenbveFcmbTrainPlugin private readonly bool AtoAvailable; /// The delay before ATO changes notches. - private readonly double AtoNotchDelay = 500; + private readonly double AtoNotchDelay = 250; /// The counter for the ATO notch delay. private double AtoNotchDelayCounter; @@ -483,6 +483,8 @@ namespace OpenbveFcmbTrainPlugin { if (AtoState == AtoStates.AwaitingStartup) { + // Release brakes to start ATO + AtoBrakeNotch = 0; AtoState = AtoStates.IncreaseSpeed; } } @@ -706,6 +708,9 @@ namespace OpenbveFcmbTrainPlugin Speed target = CurrentSpeedCode.TargetLimit; double distance = CurrentSpeedCode.TargetPosition - TrainLocation; + // Pitch multiplier, used to alter when state changes occur + double pitchMulti = train.State.Pitch / 20; + // Update notch delay counter AtoNotchDelayCounter += elapsedTime.Milliseconds; @@ -732,30 +737,41 @@ namespace OpenbveFcmbTrainPlugin AtoStartupPosition = TrainLocation; break; case AtoStates.IncreaseSpeed: - AtoBrakeNotch = 0; - if (train.Acceleration < 0.2 && AtoPowerNotch < train.Specs.PowerNotches && AtoNotchDelayCounter >= AtoNotchDelay) + if (train.Acceleration < 0.5 && AtoNotchDelayCounter >= AtoNotchDelay) { - AtoPowerNotch++; + if (AtoBrakeNotch > 0) + { + AtoBrakeNotch--; + } + else if (AtoPowerNotch < train.Specs.PowerNotches) + { + AtoPowerNotch++; + } AtoNotchDelayCounter = 0; } - if (train.State.Speed.KilometersPerHour >= target.KilometersPerHour - 5) + if (train.State.Speed.KilometersPerHour >= target.KilometersPerHour - 5 + pitchMulti) { AtoState = AtoStates.MaintainSpeed; } break; case AtoStates.MaintainSpeed: - AtoBrakeNotch = 0; - if (train.Acceleration > 0 && AtoNotchDelayCounter >= AtoNotchDelay) + if ((train.Acceleration > 0 || (AtoPowerNotch > 0 && train.State.Pitch <= 0)) && AtoNotchDelayCounter >= AtoNotchDelay) { + // Train is accelerating, try to reduce speed if (AtoPowerNotch > 0) { AtoPowerNotch--; + AtoNotchDelayCounter = 0; } - else if (AtoBrakeNotch < train.Specs.BrakeNotches) + else if (AtoBrakeNotch < train.Specs.BrakeNotches && train.State.Pitch < 0 && train.State.Speed.KilometersPerHour >= target.KilometersPerHour - 3 + pitchMulti) { AtoBrakeNotch++; + AtoNotchDelayCounter = 0; } - AtoNotchDelayCounter = 0; + } + if (train.State.Speed.KilometersPerHour <= target.KilometersPerHour - 7 + pitchMulti) + { + AtoState = AtoStates.IncreaseSpeed; } break; } @@ -767,8 +783,8 @@ namespace OpenbveFcmbTrainPlugin // ATO is driving but does not know the position of the train, unselect driving mode and set alarm state if (TrainLocation - AtoStartupPosition > 400 && !AtoPositionKnown) { - AtoState = AtoStates.Alarm; - DeviceState = DeviceStates.NoMode; + //AtoState = AtoStates.Alarm; + //DeviceState = DeviceStates.NoMode; } } }