Skip to content

Commit 24bf2eb

Browse files
committed
Cruise control parking mode
1 parent 5cb0ed0 commit 24bf2eb

File tree

4 files changed

+40
-14
lines changed

4 files changed

+40
-14
lines changed

Source/Orts.Simulation/Common/Scripting/BrakeController.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ public float IntermediateValue
189189
/// <summary>
190190
/// Fraction of train brake demanded by cruise control
191191
/// </summary>
192-
public float CruiseControlBrakeDemand() => Locomotive.CruiseControl != null ? Locomotive.CruiseControl.TrainBrakePercent / 100 : 0;
192+
public float CruiseControlBrakeDemand() => Host.CruiseControlBrakeDemand;
193193

194194
/// <summary>
195195
/// Current notch of the brake controller

Source/Orts.Simulation/Simulation/RollingStocks/SubSystems/Controllers/BrakeController.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,15 @@ public bool OverchargeButtonPressed
152152
public float FullServReductionPSI { get; private set; }
153153
public float MinReductionPSI { get; private set; }
154154
public float TrainDynamicBrakeIntervention { get; set; } = -1;
155+
public float CruiseControlBrakeDemand
156+
{
157+
get
158+
{
159+
if (Locomotive.CruiseControl == null) return 0;
160+
if (this == Locomotive.EngineBrakeController) return Locomotive.CruiseControl.EngineBrakePercent / 100;
161+
else return Locomotive.CruiseControl.TrainBrakePercent / 100;
162+
}
163+
}
155164
InterpolatorDiesel2D DynamicBrakeBlendingTable;
156165

157166
/// <summary>

Source/Orts.Simulation/Simulation/RollingStocks/SubSystems/Controllers/MSTSBrakeController.cs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -296,11 +296,18 @@ public override void UpdateEngineBrakePressure(ref float pressureBar, float elap
296296
DecreasePressure(ref pressureBar, x, ReleaseRateBarpS(), elapsedClockSeconds);
297297
break;
298298
}
299-
if (pressureBar > MaxPressureBar())
300-
pressureBar = MaxPressureBar();
301-
if (pressureBar < 0)
302-
pressureBar = 0;
303299
}
300+
301+
float ccdemand = CruiseControlBrakeDemand();
302+
if (ccdemand > 0)
303+
{
304+
pressureBar = Math.Max((MaxPressureBar() - FullServReductionBar()) * ccdemand, pressureBar);
305+
}
306+
307+
if (pressureBar > MaxPressureBar())
308+
pressureBar = MaxPressureBar();
309+
if (pressureBar < 0)
310+
pressureBar = 0;
304311
}
305312

306313
public override void HandleEvent(BrakeControllerEvent evt)

Source/Orts.Simulation/Simulation/RollingStocks/SubSystems/CruiseControl.cs

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,8 @@ public float SetSpeedKpHOrMpH
103103
public float DynamicBrakeMaxForceAtSelectorStep = 0;
104104
public float? ThrottlePercent { get; private set;}
105105
public float? DynamicBrakePercent { get; private set;}
106-
public float TrainBrakePercent { get; private set;}
106+
public float TrainBrakePercent { get; private set; }
107+
public float EngineBrakePercent { get; private set; }
107108
protected float trainLength = 0;
108109
public int TrainLengthMeters = 0;
109110
public float CurrentSelectedSpeedMpS = 0;
@@ -447,6 +448,7 @@ public void Update(float elapsedClockSeconds)
447448
ThrottlePercent = null;
448449
DynamicBrakePercent = null;
449450
TrainBrakePercent = 0;
451+
EngineBrakePercent = 0;
450452
return;
451453
}
452454

@@ -477,6 +479,7 @@ public void Update(float elapsedClockSeconds)
477479
ThrottlePercent = null;
478480
DynamicBrakePercent = null;
479481
TrainBrakePercent = 0;
482+
EngineBrakePercent = 0;
480483
}
481484
else if (SpeedRegMode == SpeedRegulatorMode.Auto)
482485
{
@@ -500,13 +503,18 @@ public void Update(float elapsedClockSeconds)
500503
timeFromEngineMoved = 0;
501504
reducingForce = true;
502505
}
503-
if (SpeedRegulatorOptions.Contains("engageforceonnonzerospeed") && SelectedSpeedMpS > 0)
506+
if (SpeedRegulatorOptions.Contains("engageforceonnonzerospeed") && SelectedSpeedMpS > 0 && (SpeedSelMode != SpeedSelectorMode.Parking || !ForceResetRequiredAfterBraking || (WasForceReset && SelectedMaxAccelerationPercent > 0)))
504507
{
505508
SpeedSelMode = SpeedSelectorMode.On;
506509
SpeedRegMode = SpeedRegulatorMode.Auto;
507510
SkipThrottleDisplay = true;
508511
reducingForce = false;
509512
}
513+
else if (SpeedRegulatorOptions.Contains("engageparkingonzerospeed") && SelectedSpeedMpS == 0 && Locomotive.AbsWheelSpeedMpS <= (SpeedIsMph ? MpS.FromMpH(ParkingBrakeEngageSpeed) : MpS.FromKpH(ParkingBrakeEngageSpeed)) && SpeedSelMode != SpeedSelectorMode.Parking)
514+
{
515+
SpeedSelMode = SpeedSelectorMode.Parking;
516+
WasForceReset = false;
517+
}
510518
if (Locomotive.TrainBrakeController.MaxPressurePSI - Locomotive.BrakeSystem.BrakeLine1PressurePSI < 1 && Locomotive.Train.BrakeLine4 <= 0)
511519
{
512520
if (TrainBrakePercent == 0) CCIsUsingTrainBrake = false;
@@ -542,9 +550,6 @@ public void Update(float elapsedClockSeconds)
542550
(ForceResetRequiredAfterBraking && (TrainBrakeCommandHasPriorityOverAcceleratingCruiseControl && (CCThrottleOrDynBrakePercent > 0 || TrainBrakeCommandHasPriorityOverCruiseControl)) &&
543551
(!WasForceReset || (WasBraking && SelectedMaxAccelerationPercent > 0))))
544552
{
545-
if (SpeedSelMode == SpeedSelectorMode.Parking)
546-
if (Locomotive.AbsWheelSpeedMpS < (SpeedIsMph ? MpS.FromMpH(ParkingBrakeEngageSpeed) : MpS.FromKpH(ParkingBrakeEngageSpeed)))
547-
Locomotive.SetEngineBrakePercent(ParkingBrakePercent);
548553
CCThrottleOrDynBrakePercent = 0;
549554
TrainBrakePercent = 0;
550555
}
@@ -567,6 +572,15 @@ public void Update(float elapsedClockSeconds)
567572
}
568573
else if (CCThrottleOrDynBrakePercent < 0) DynamicBrakePercent = -CCThrottleOrDynBrakePercent;
569574
else DynamicBrakePercent = -1;
575+
if (SpeedSelMode == SpeedSelectorMode.Parking && !EngineBrakePriority)
576+
{
577+
if (Locomotive.AbsWheelSpeedMpS <= (SpeedIsMph ? MpS.FromMpH(ParkingBrakeEngageSpeed) : MpS.FromKpH(ParkingBrakeEngageSpeed)))
578+
EngineBrakePercent = ParkingBrakePercent;
579+
}
580+
else
581+
{
582+
EngineBrakePercent = 0;
583+
}
570584
if (!IsActive && wasActive)
571585
{
572586
CCIsUsingTrainBrake = false;
@@ -724,7 +738,6 @@ public void SpeedSelectorModeStartIncrease()
724738
while (!test)
725739
{
726740
SpeedSelMode++;
727-
if (SpeedSelMode != SpeedSelectorMode.Parking && !EngineBrakePriority) Locomotive.SetEngineBrakePercent(0);
728741
switch (SpeedSelMode)
729742
{
730743
case SpeedSelectorMode.Neutral: if (SpeedRegulatorOptions.Contains("selectorneutral")) test = true; break;
@@ -1194,9 +1207,6 @@ public void CalculateRequiredForce(float elapsedClockSeconds, float AbsWheelSpee
11941207
{
11951208
CCThrottleOrDynBrakePercent = 0;
11961209
}
1197-
1198-
if (AbsWheelSpeedMpS < (SpeedIsMph ? MpS.FromMpH(ParkingBrakeEngageSpeed) : MpS.FromKpH(ParkingBrakeEngageSpeed)))
1199-
Locomotive.SetEngineBrakePercent(ParkingBrakePercent);
12001210
}
12011211
else if (SpeedSelMode == SpeedSelectorMode.Neutral || SpeedSelMode < SpeedSelectorMode.Start && !SpeedRegulatorOptions.Contains("startfromzero") && AbsWheelSpeedMpS < SafeSpeedForAutomaticOperationMpS)
12021212
{

0 commit comments

Comments
 (0)