@@ -38,6 +38,7 @@ public class AirSinglePipe : MSTSBrakeSystem
3838 protected float AutoCylPressurePSI = 64 ;
3939 protected float AuxResPressurePSI = 64 ;
4040 protected float EmergResPressurePSI = 64 ;
41+ protected float ControlResPressurePSI = 64 ;
4142 protected float FullServPressurePSI = 50 ;
4243 protected float MaxCylPressurePSI = 64 ;
4344 protected float AuxCylVolumeRatio = 2.5f ;
@@ -53,7 +54,6 @@ public class AirSinglePipe : MSTSBrakeSystem
5354 protected float EmergAuxVolumeRatio = 1.4f ;
5455 protected string DebugType = string . Empty ;
5556 protected string RetainerDebugState = string . Empty ;
56- protected bool NoMRPAuxResCharging ;
5757 protected float CylVolumeM3 ;
5858
5959
@@ -116,7 +116,6 @@ public override void InitializeFromCopy(BrakeSystem copy)
116116 EmergResChargingRatePSIpS = thiscopy . EmergResChargingRatePSIpS ;
117117 EmergAuxVolumeRatio = thiscopy . EmergAuxVolumeRatio ;
118118 TwoPipes = thiscopy . TwoPipes ;
119- NoMRPAuxResCharging = thiscopy . NoMRPAuxResCharging ;
120119 HoldingValve = thiscopy . HoldingValve ;
121120 }
122121
@@ -265,6 +264,7 @@ public override void Save(BinaryWriter outf)
265264 outf . Write ( AutoCylPressurePSI ) ;
266265 outf . Write ( AuxResPressurePSI ) ;
267266 outf . Write ( EmergResPressurePSI ) ;
267+ outf . Write ( ControlResPressurePSI ) ;
268268 outf . Write ( FullServPressurePSI ) ;
269269 outf . Write ( ( int ) TripleValveState ) ;
270270 outf . Write ( FrontBrakeHoseConnected ) ;
@@ -287,6 +287,7 @@ public override void Restore(BinaryReader inf)
287287 AutoCylPressurePSI = inf . ReadSingle ( ) ;
288288 AuxResPressurePSI = inf . ReadSingle ( ) ;
289289 EmergResPressurePSI = inf . ReadSingle ( ) ;
290+ ControlResPressurePSI = inf . ReadSingle ( ) ;
290291 FullServPressurePSI = inf . ReadSingle ( ) ;
291292 TripleValveState = ( ValveState ) inf . ReadInt32 ( ) ;
292293 FrontBrakeHoseConnected = inf . ReadBoolean ( ) ;
@@ -311,11 +312,13 @@ public override void Initialize(bool handbrakeOn, float maxPressurePSI, float fu
311312 BrakeLine1PressurePSI = Car . Train . EqualReservoirPressurePSIorInHg ;
312313 BrakeLine2PressurePSI = Car . Train . BrakeLine2PressurePSI ;
313314 BrakeLine3PressurePSI = 0 ;
314- if ( ( Car as MSTSWagon ) . EmergencyReservoirPresent || maxPressurePSI > 0 )
315- EmergResPressurePSI = maxPressurePSI ;
315+ if ( maxPressurePSI > 0 )
316+ ControlResPressurePSI = maxPressurePSI ;
316317 FullServPressurePSI = fullServPressurePSI ;
317318 AutoCylPressurePSI = immediateRelease ? 0 : Math . Min ( ( maxPressurePSI - BrakeLine1PressurePSI ) * AuxCylVolumeRatio , MaxCylPressurePSI ) ;
318319 AuxResPressurePSI = TwoPipes ? maxPressurePSI : Math . Max ( maxPressurePSI - AutoCylPressurePSI / AuxCylVolumeRatio , BrakeLine1PressurePSI ) ;
320+ if ( ( Car as MSTSWagon ) . EmergencyReservoirPresent )
321+ EmergResPressurePSI = Math . Max ( AuxResPressurePSI , maxPressurePSI ) ;
319322 TripleValveState = ValveState . Lap ;
320323 HoldingValve = ValveState . Release ;
321324 HandbrakePercent = handbrakeOn & ( Car as MSTSWagon ) . HandBrakePresent ? 100 : 0 ;
@@ -339,24 +342,22 @@ public override void Initialize(bool handbrakeOn, float maxPressurePSI, float fu
339342 /// </summary>
340343 public override void InitializeMoving ( )
341344 {
342- var emergResPressurePSI = EmergResPressurePSI ;
343345 Initialize ( false , 0 , FullServPressurePSI , true ) ;
344- EmergResPressurePSI = emergResPressurePSI ;
345346 }
346347
347348 public override void LocoInitializeMoving ( ) // starting conditions when starting speed > 0
348349 {
349350 }
350351
351- public virtual void UpdateTripleValveState ( float controlPressurePSI )
352+ public virtual void UpdateTripleValveState ( float targetPressurePSI )
352353 {
353354 if ( BrakeLine1PressurePSI < FullServPressurePSI - 1 )
354355 TripleValveState = ValveState . Emergency ;
355356 else if ( BrakeLine1PressurePSI > AuxResPressurePSI + 1 )
356357 TripleValveState = ValveState . Release ;
357358 else if ( TripleValveState == ValveState . Emergency && BrakeLine1PressurePSI > AuxResPressurePSI )
358359 TripleValveState = ValveState . Release ;
359- else if ( EmergResPressurePSI > 70 && BrakeLine1PressurePSI > EmergResPressurePSI * 0.97f ) // UIC regulation: for 5 bar systems, release if > 4.85 bar
360+ else if ( ControlResPressurePSI > 70 && BrakeLine1PressurePSI > ControlResPressurePSI * 0.97f ) // UIC regulation: for 5 bar systems, release if > 4.85 bar
360361 TripleValveState = ValveState . Release ;
361362 else if ( TripleValveState != ValveState . Emergency && BrakeLine1PressurePSI < AuxResPressurePSI - 1 )
362363 TripleValveState = ValveState . Apply ;
@@ -366,13 +367,7 @@ public virtual void UpdateTripleValveState(float controlPressurePSI)
366367
367368 public override void Update ( float elapsedClockSeconds )
368369 {
369- //ValveState prevTripleValueState = TripleValveState;
370-
371- // Emergency reservoir's second role (in OpenRails) is to act as a control reservoir,
372- // maintaining a reference control pressure for graduated release brake actions.
373- // Thus this pressure must be set even in brake systems ER not present otherwise. It just stays static in this case.
374- float threshold = Math . Max ( RetainerPressureThresholdPSI ,
375- ( Car as MSTSWagon ) . DistributorPresent ? ( EmergResPressurePSI - BrakeLine1PressurePSI ) * AuxCylVolumeRatio : 0 ) ;
370+ float threshold = ( Car as MSTSWagon ) . DistributorPresent ? ( ControlResPressurePSI - BrakeLine1PressurePSI ) * AuxCylVolumeRatio : 0 ;
376371
377372 if ( BleedOffValveOpen )
378373 {
@@ -406,7 +401,7 @@ public override void Update(float elapsedClockSeconds)
406401 float dp = elapsedClockSeconds * MaxApplicationRatePSIpS ;
407402 if ( AuxResPressurePSI - dp / AuxCylVolumeRatio < AutoCylPressurePSI + dp )
408403 dp = ( AuxResPressurePSI - AutoCylPressurePSI ) * AuxCylVolumeRatio / ( 1 + AuxCylVolumeRatio ) ;
409- if ( TwoPipes && dp > threshold - AutoCylPressurePSI )
404+ if ( ( Car as MSTSWagon ) . DistributorPresent && dp > threshold - AutoCylPressurePSI )
410405 dp = threshold - AutoCylPressurePSI ;
411406 if ( AutoCylPressurePSI + dp > MaxCylPressurePSI )
412407 dp = MaxCylPressurePSI - AutoCylPressurePSI ;
@@ -431,6 +426,8 @@ public override void Update(float elapsedClockSeconds)
431426 // triple valve set to release pressure in brake cylinder and EP valve set
432427 if ( TripleValveState == ValveState . Release && HoldingValve == ValveState . Release )
433428 {
429+ if ( threshold < RetainerPressureThresholdPSI )
430+ threshold = RetainerPressureThresholdPSI ;
434431 if ( AutoCylPressurePSI > threshold )
435432 {
436433 AutoCylPressurePSI -= elapsedClockSeconds * ReleaseRatePSIpS ;
@@ -440,7 +437,7 @@ public override void Update(float elapsedClockSeconds)
440437
441438 if ( ( Car as MSTSWagon ) . EmergencyReservoirPresent )
442439 {
443- if ( ! ( Car as MSTSWagon ) . DistributorPresent && AuxResPressurePSI < EmergResPressurePSI && AuxResPressurePSI < BrakeLine1PressurePSI )
440+ if ( AuxResPressurePSI < EmergResPressurePSI && AuxResPressurePSI < BrakeLine1PressurePSI )
444441 {
445442 float dp = elapsedClockSeconds * EmergResChargingRatePSIpS ;
446443 if ( EmergResPressurePSI - dp < AuxResPressurePSI + dp * EmergAuxVolumeRatio )
@@ -459,7 +456,7 @@ public override void Update(float elapsedClockSeconds)
459456 AuxResPressurePSI -= dp * EmergAuxVolumeRatio ;
460457 }
461458 }
462- if ( AuxResPressurePSI < BrakeLine1PressurePSI && ( ! TwoPipes || NoMRPAuxResCharging || BrakeLine2PressurePSI < BrakeLine1PressurePSI ) && ! BleedOffValveOpen )
459+ if ( AuxResPressurePSI < BrakeLine1PressurePSI && ( ! TwoPipes || ! ( Car as MSTSWagon ) . DistributorPresent || BrakeLine2PressurePSI < BrakeLine1PressurePSI ) && ! BleedOffValveOpen )
463460 {
464461 float dp = elapsedClockSeconds * MaxAuxilaryChargingRatePSIpS ; // Change in pressure for train brake pipe.
465462 if ( AuxResPressurePSI + dp > BrakeLine1PressurePSI - dp * AuxBrakeLineVolumeRatio )
@@ -479,9 +476,9 @@ public override void Update(float elapsedClockSeconds)
479476
480477 // Charge Auxiliary reservoir for MRP
481478 if ( TwoPipes
482- && ! NoMRPAuxResCharging
479+ && ( Car as MSTSWagon ) . DistributorPresent
483480 && AuxResPressurePSI < BrakeLine2PressurePSI
484- && AuxResPressurePSI < EmergResPressurePSI
481+ && AuxResPressurePSI < ControlResPressurePSI
485482 && ( BrakeLine2PressurePSI > BrakeLine1PressurePSI || TripleValveState != ValveState . Release ) && ! BleedOffValveOpen )
486483 {
487484 float dp = elapsedClockSeconds * MaxAuxilaryChargingRatePSIpS ;
@@ -725,25 +722,11 @@ protected static void PropagateBrakeLinePressures(float elapsedClockSeconds, Tra
725722 PressureDiffEqualToPipePSI = 0 ;
726723
727724 // Adjust brake pipe pressure based upon pressure differential
728- if ( lead . TrainBrakePipeLeakPSIorInHgpS == 0 ) // Train pipe leakage disabled (ie. No Train Leakage parameter present in ENG file)
725+ if ( lead . TrainBrakeController . TrainBrakeControllerState != ControllerState . Lap ) // in LAP psoition brake pipe is isolated, and thus brake pipe pressure decreases, but reservoir remains at same pressure
729726 {
730727 lead . BrakeSystem . BrakeLine1PressurePSI += PressureDiffEqualToPipePSI ;
731728 lead . MainResPressurePSI -= PressureDiffEqualToPipePSI * lead . BrakeSystem . BrakePipeVolumeM3 / lead . MainResVolumeM3 ;
732729 }
733- else
734- // Train pipe leakage is enabled (ie. ENG file parameter present)
735- {
736- // If pipe leakage and brake control valve is in LAP position then pipe is connected to main reservoir and maintained at equalising pressure from reservoir
737- // All other brake states will have the brake pipe connected to the main reservoir, and therefore leakage will be compenstaed by air from main reservoir
738- // Modern self lap brakes will maintain pipe pressure using air from main reservoir
739-
740- if ( lead . TrainBrakeController . TrainBrakeControllerState != ControllerState . Lap )
741- {
742- lead . BrakeSystem . BrakeLine1PressurePSI += PressureDiffEqualToPipePSI ; // Increase brake pipe pressure to cover loss
743- lead . MainResPressurePSI = lead . MainResPressurePSI - ( PressureDiffEqualToPipePSI * lead . BrakeSystem . BrakePipeVolumeM3 / lead . MainResVolumeM3 ) ; // Decrease main reservoir pressure
744- }
745- // else in LAP psoition brake pipe is isolated, and thus brake pipe pressure decreases, but reservoir remains at same pressure
746- }
747730 }
748731 // reduce pressure in lead brake line if brake pipe pressure is above equalising pressure - apply brakes
749732 else if ( lead . BrakeSystem . BrakeLine1PressurePSI > train . EqualReservoirPressurePSIorInHg )
@@ -1011,6 +994,7 @@ public void NormalizePressures(float maxPressurePSI)
1011994 if ( AuxResPressurePSI > maxPressurePSI ) AuxResPressurePSI = maxPressurePSI ;
1012995 if ( BrakeLine1PressurePSI > maxPressurePSI ) BrakeLine1PressurePSI = maxPressurePSI ;
1013996 if ( EmergResPressurePSI > maxPressurePSI ) EmergResPressurePSI = maxPressurePSI ;
997+ if ( ControlResPressurePSI > maxPressurePSI ) ControlResPressurePSI = maxPressurePSI ;
1014998 }
1015999
10161000 public override bool IsBraking ( )
0 commit comments