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;
}
}
}
diff --git a/src/Train/Train.cs b/src/Train/Train.cs
index 3bcd09c..4b67e22 100644
--- a/src/Train/Train.cs
+++ b/src/Train/Train.cs
@@ -54,8 +54,11 @@ namespace OpenbveFcmbTrainPlugin
/// The current acceleration of the train.
internal double Acceleration { get; private set; }
- /// The time when acceleration was calculated.
- private Time AccelerationTime = new Time(0);
+ /// The time elapsed since acceleration was last calculated.
+ private double AccelerationTimer;
+
+ /// The maximum time elapsed between acceleration calculations.
+ private const double AccelerationMaximumTimer = 100;
/// The speed when acceleration was calculated.
private Speed AccelerationSpeed = new Speed(0);
@@ -133,16 +136,14 @@ namespace OpenbveFcmbTrainPlugin
data.Handles.BrakeNotch = data.Handles.BrakeNotch;
// Calculate acceleration
- if (OpenbveFcmbTrainPlugin.Initializing)
+ AccelerationTimer += data.ElapsedTime.Milliseconds;
+ if (AccelerationTimer >= AccelerationMaximumTimer)
{
- AccelerationTime = data.TotalTime;
- }
- if (data.TotalTime.Milliseconds - AccelerationTime.Milliseconds > 200)
- {
- Acceleration = Math.Round((State.Speed.MetersPerSecond - AccelerationSpeed.MetersPerSecond) / (data.TotalTime.Seconds - AccelerationTime.Seconds), 4);
- AccelerationTime = data.TotalTime;
- AccelerationSpeed = State.Speed;
+ Acceleration = Math.Round((data.Vehicle.Speed.MetersPerSecond - AccelerationSpeed.MetersPerSecond) / AccelerationTimer * 1000, 4);
+ AccelerationTimer = 0;
+ AccelerationSpeed = data.Vehicle.Speed;
}
+ data.DebugMessage = Acceleration.ToString();
// Retrieve data from all devices
foreach (Device dev in Devices)