@@ -2106,10 +2106,10 @@ public override void Update(float elapsedClockSeconds)
2106
2106
if ( DynamicBrakeCommandStartTime + DynamicBrakeDelayS < Simulator . ClockTime )
2107
2107
{
2108
2108
DynamicBrake = true ; // Engage
2109
- if ( IsLeadLocomotive ( ) && DynamicBrakeController . CurrentValue > 0 )
2109
+ if ( IsLeadLocomotive ( ) && DynamicBrakeController ? . CurrentValue > 0 )
2110
2110
Simulator . Confirmer . ConfirmWithPerCent ( CabControl . DynamicBrake , DynamicBrakeController . CurrentValue * 100 ) ;
2111
2111
}
2112
- else if ( IsLeadLocomotive ( ) && DynamicBrakeController . CurrentValue > 0 )
2112
+ else if ( IsLeadLocomotive ( ) && DynamicBrakeController ? . CurrentValue > 0 )
2113
2113
Simulator . Confirmer . Confirm ( CabControl . DynamicBrake , CabSetting . On ) ; // Keeping status string on screen so user knows what's happening
2114
2114
}
2115
2115
}
@@ -2394,24 +2394,31 @@ protected virtual void UpdateControllers(float elapsedClockSeconds)
2394
2394
{
2395
2395
LocalDynamicBrakePercent = TrainBrakeController . TrainDynamicBrakeIntervention * 100 ;
2396
2396
}
2397
- if ( DynamicBrakeController != null && DynamicBrakeController . CurrentValue > 0 )
2397
+ if ( DynamicBrakeController != null && ( DynamicBrakeController . CurrentValue > 0 || DynamicBrakeController . UpdateValue > 0 ) )
2398
2398
{
2399
2399
float prevValue = DynamicBrakeController . CurrentValue ;
2400
+
2400
2401
if ( DynamicBrake || ! DynamicBrakeControllerSetupLock )
2401
2402
DynamicBrakeController . Update ( elapsedClockSeconds ) ;
2402
- // Dynamic brake is about to be disabled, pause motion of controller to prevent accidental shut-off
2403
- if ( DynamicBrakeController . CurrentValue <= 0 )
2403
+
2404
+ // Dynamic brake is about to be enabled or disabled, pause motion of controller to prevent accidental overshooting
2405
+ if ( ( DynamicBrakeController . CurrentValue <= 0 && prevValue > 0 ) || ( DynamicBrakeController . CurrentValue > 0 && prevValue <= 0 ) )
2404
2406
{
2405
2407
if ( ! DynamicBrakePause )
2406
2408
{
2407
2409
DynamicBrakePause = true ;
2408
- StopDynamicBrakeDecrease ( ) ;
2409
- DynamicBrakeController . CurrentValue = prevValue ;
2410
+ if ( DynamicBrakeController . UpdateValue < 0 )
2411
+ {
2412
+ StopDynamicBrakeDecrease ( ) ;
2413
+ DynamicBrakeController . CurrentValue = prevValue ;
2414
+ }
2415
+ else if ( DynamicBrakeController . UpdateValue > 0 )
2416
+ StopDynamicBrakeIncrease ( ) ;
2410
2417
}
2411
2418
else
2412
2419
DynamicBrakePause = false ;
2413
2420
}
2414
- else if ( DynamicBrakeController . CurrentValue > prevValue )
2421
+ else if ( DynamicBrakeController . UpdateValue != 0 )
2415
2422
DynamicBrakePause = false ;
2416
2423
2417
2424
LocalDynamicBrakePercent = Math . Max ( DynamicBrakeController . CurrentValue * 100 , LocalDynamicBrakePercent ) ;
@@ -4098,7 +4105,7 @@ public void SetCombinedHandleValue(float value)
4098
4105
ThrottleController . IntermediateValue = 0 ;
4099
4106
}
4100
4107
// Return to throttling
4101
- else if ( ( DynamicBrakeController . CurrentValue <= 0 && value < CombinedControlSplitPosition ) ||
4108
+ else if ( ( DynamicBrakeController ? . CurrentValue ?? 0 ) <= 0 ||
4102
4109
( CruiseControl != null && ! CruiseControl . DynamicBrakePriority && CruiseControl . SpeedRegMode == CruiseControl . SpeedRegulatorMode . Auto ) )
4103
4110
{
4104
4111
SetThrottleValue ( 1 - MathHelper . Clamp ( value , 0 , CombinedControlSplitPosition ) / CombinedControlSplitPosition ) ;
@@ -4118,9 +4125,9 @@ public void SetCombinedHandleValue(float value)
4118
4125
/// <returns>Combined position into 0-1 range, where arrangement is [[1--throttle--0]split[0--dynamic|airbrake--1]]</returns>
4119
4126
public float GetCombinedHandleValue ( bool intermediateValue )
4120
4127
{
4121
- float throttleValue = intermediateValue ? ThrottleController . IntermediateValue : ThrottleController . CurrentValue ;
4122
- float dynamicsValue = intermediateValue ? DynamicBrakeController . IntermediateValue : DynamicBrakeController . CurrentValue ;
4123
- float brakesValue = intermediateValue ? TrainBrakeController . IntermediateValue : TrainBrakeController . CurrentValue ;
4128
+ var throttleValue = intermediateValue ? ThrottleController ? . IntermediateValue : ThrottleController ? . CurrentValue ;
4129
+ var dynamicsValue = intermediateValue ? DynamicBrakeController ? . IntermediateValue : DynamicBrakeController ? . CurrentValue ;
4130
+ var brakesValue = intermediateValue ? TrainBrakeController ? . IntermediateValue : TrainBrakeController ? . CurrentValue ;
4124
4131
4125
4132
if ( CruiseControl ? . SpeedRegMode == CruiseControl . SpeedRegulatorMode . Auto )
4126
4133
{
@@ -4142,14 +4149,14 @@ public float GetCombinedHandleValue(bool intermediateValue)
4142
4149
if ( CruiseControl != null && CruiseControl . SkipThrottleDisplay && ! CruiseControl . DynamicBrakeCommandHasPriorityOverCruiseControl )
4143
4150
return CombinedControlSplitPosition ;
4144
4151
else
4145
- return CombinedControlSplitPosition + ( 1 - CombinedControlSplitPosition ) * dynamicsValue ;
4152
+ return CombinedControlSplitPosition + ( 1 - CombinedControlSplitPosition ) * ( dynamicsValue ?? 0 ) ;
4146
4153
}
4147
4154
else if ( CombinedControlType == CombinedControl . ThrottleAir && throttleValue <= 0 && brakesValue > 0 )
4148
- return CombinedControlSplitPosition + ( 1 - CombinedControlSplitPosition ) * brakesValue ;
4155
+ return CombinedControlSplitPosition + ( 1 - CombinedControlSplitPosition ) * ( brakesValue ?? 0 ) ;
4149
4156
else if ( CruiseControl == null )
4150
- return CombinedControlSplitPosition * ( 1 - throttleValue ) ;
4157
+ return CombinedControlSplitPosition * ( 1 - ( throttleValue ?? 0 ) ) ;
4151
4158
else if ( CruiseControl . SpeedRegMode == CruiseControl . SpeedRegulatorMode . Manual )
4152
- return CombinedControlSplitPosition * ( 1 - throttleValue ) ;
4159
+ return CombinedControlSplitPosition * ( 1 - ( throttleValue ?? 0 ) ) ;
4153
4160
else if ( CruiseControl . UseThrottleAsSpeedSelector )
4154
4161
return CombinedControlSplitPosition * ( 1 - ( CruiseControl . SelectedSpeedMpS / MaxSpeedMpS ) ) ;
4155
4162
else if ( CruiseControl . UseThrottleAsForceSelector && CruiseControl . UseThrottleInCombinedControl )
@@ -4726,6 +4733,8 @@ public void StartDynamicBrakeIncrease(float? target)
4726
4733
// Only allow increasing dynamic brake if dynamic braking is off, there's no setup lock, or dynamic braking is already active
4727
4734
if ( DynamicBrake || ! DynamicBrakeControllerSetupLock || DynamicBrakeController . CurrentValue <= 0 )
4728
4735
{
4736
+ float prevValue = DynamicBrakeController . CurrentValue ;
4737
+
4729
4738
DynamicBrakeController . StartIncrease ( target ) ;
4730
4739
4731
4740
AlerterReset ( TCSEvent . DynamicBrakeChanged ) ;
@@ -4735,6 +4744,12 @@ public void StartDynamicBrakeIncrease(float? target)
4735
4744
StopDynamicBrakeIncrease ( ) ;
4736
4745
Simulator . Confirmer . ConfirmWithPerCent ( CabControl . DynamicBrake , DynamicBrakeController . CurrentValue * 100 ) ;
4737
4746
}
4747
+ // If this is the first application of dynamics, pause movement to prevent accidental over-application
4748
+ else if ( DynamicBrakeController . CurrentValue > 0 && prevValue <= 0 )
4749
+ {
4750
+ DynamicBrakePause = true ;
4751
+ StopDynamicBrakeIncrease ( ) ;
4752
+ }
4738
4753
}
4739
4754
}
4740
4755
@@ -4862,7 +4877,8 @@ public void SetDynamicBrakePercentWithSound(float percent)
4862
4877
4863
4878
public bool CheckDisableDynamicBrake ( )
4864
4879
{
4865
- if ( DynamicBrakeController . CurrentValue <= 0 )
4880
+ // Only disable the dynamic brake if the lever is in the off position and the controller isn't trying to increase
4881
+ if ( DynamicBrakeController . CurrentValue <= 0 && DynamicBrakeController . UpdateValue <= 0 )
4866
4882
{
4867
4883
StopDynamicBrakeDecrease ( ) ;
4868
4884
Simulator . Confirmer . Confirm ( CabControl . DynamicBrake , CabSetting . Off ) ;
0 commit comments