@@ -338,7 +338,8 @@ public override void LocoInitializeMoving() // starting conditions when starting
338338
339339 public void UpdateTripleValveState ( float elapsedClockSeconds )
340340 {
341- if ( ( Car as MSTSWagon ) . BrakeValve == MSTSWagon . BrakeValveType . Distributor )
341+ var valveType = ( Car as MSTSWagon ) . BrakeValve ;
342+ if ( valveType == MSTSWagon . BrakeValveType . Distributor )
342343 {
343344 float targetPressurePSI = ( ControlResPressurePSI - BrakeLine1PressurePSI ) * AuxCylVolumeRatio ;
344345 if ( targetPressurePSI > AutoCylPressurePSI && EmergencyValveActuationRatePSIpS > 0 && ( prevBrakePipePressurePSI - BrakeLine1PressurePSI ) > Math . Max ( elapsedClockSeconds , 0.0001f ) * EmergencyValveActuationRatePSIpS )
@@ -351,7 +352,7 @@ public void UpdateTripleValveState(float elapsedClockSeconds)
351352 else
352353 TripleValveState = ValveState . Lap ;
353354 }
354- else
355+ else if ( valveType == MSTSWagon . BrakeValveType . TripleValve || valveType == MSTSWagon . BrakeValveType . Distributor )
355356 {
356357 if ( BrakeLine1PressurePSI < AuxResPressurePSI - 1 && EmergencyValveActuationRatePSIpS > 0 && ( prevBrakePipePressurePSI - BrakeLine1PressurePSI ) > Math . Max ( elapsedClockSeconds , 0.0001f ) * EmergencyValveActuationRatePSIpS )
357358 TripleValveState = ValveState . Emergency ;
@@ -364,6 +365,10 @@ public void UpdateTripleValveState(float elapsedClockSeconds)
364365 else if ( TripleValveState == ValveState . Apply && BrakeLine1PressurePSI >= AuxResPressurePSI )
365366 TripleValveState = ValveState . Lap ;
366367 }
368+ else
369+ {
370+ TripleValveState = ValveState . Release ;
371+ }
367372 prevBrakePipePressurePSI = BrakeLine1PressurePSI ;
368373 }
369374
@@ -423,13 +428,16 @@ public override void Update(float elapsedClockSeconds)
423428 AuxResPressurePSI -= dp / AuxCylVolumeRatio ;
424429 AutoCylPressurePSI += dp ;
425430
426- if ( TripleValveState == ValveState . Emergency && ( Car as MSTSWagon ) . EmergencyReservoirPresent )
431+ if ( TripleValveState == ValveState . Emergency )
427432 {
428- dp = elapsedClockSeconds * MaxApplicationRatePSIpS ;
429- if ( EmergResPressurePSI - dp < AuxResPressurePSI + dp * EmergAuxVolumeRatio )
430- dp = ( EmergResPressurePSI - AuxResPressurePSI ) / ( 1 + EmergAuxVolumeRatio ) ;
431- EmergResPressurePSI -= dp ;
432- AuxResPressurePSI += dp * EmergAuxVolumeRatio ;
433+ if ( ( Car as MSTSWagon ) . EmergencyReservoirPresent )
434+ {
435+ dp = elapsedClockSeconds * MaxApplicationRatePSIpS ;
436+ if ( EmergResPressurePSI - dp < AuxResPressurePSI + dp * EmergAuxVolumeRatio )
437+ dp = ( EmergResPressurePSI - AuxResPressurePSI ) / ( 1 + EmergAuxVolumeRatio ) ;
438+ EmergResPressurePSI -= dp ;
439+ AuxResPressurePSI += dp * EmergAuxVolumeRatio ;
440+ }
433441 }
434442 }
435443
@@ -553,36 +561,47 @@ public override void Update(float elapsedClockSeconds)
553561 }
554562 else
555563 {
556- bool bailoff = false ;
557-
558564 if ( Car is MSTSLocomotive loco && loco . EngineType != TrainCar . EngineTypes . Control ) // TODO - Control cars ned to be linked to power suppy requirements.
559565 {
566+ bool isolateAutoBrake = false ;
560567 // if (Car is MSTSLocomotive loco && loco.LocomotivePowerSupply.MainPowerSupplyOn)
561568 if ( loco . LocomotivePowerSupply . MainPowerSupplyOn )
562569 {
563- if ( loco . Train . LeadLocomotiveIndex >= 0 && ( ( MSTSLocomotive ) loco . Train . Cars [ loco . Train . LeadLocomotiveIndex ] ) . BailOff )
564- {
565- bailoff = true ;
566- CylPressurePSI -= MaxReleaseRatePSIpS * elapsedClockSeconds ;
567- if ( CylPressurePSI < 0 ) CylPressurePSI = 0 ;
570+ if ( loco . Train . LeadLocomotiveIndex >= 0 )
571+ {
572+ var lead = loco . Train . Cars [ loco . Train . LeadLocomotiveIndex ] as MSTSLocomotive ;
573+ if ( lead != null && ( lead . BailOff ||
574+ ( lead . EngineBrakeController != null && lead . EngineBrakeController . CurrentNotch >= 0 && lead . EngineBrakeController . Notches [ lead . EngineBrakeController . CurrentNotch ] . Type == ControllerState . BailOff ) ) )
575+ {
576+ if ( loco . BrakeValve == MSTSWagon . BrakeValveType . Distributor )
577+ {
578+ ControlResPressurePSI = 0 ;
579+ }
580+ else
581+ {
582+ AutoCylPressurePSI -= MaxReleaseRatePSIpS * elapsedClockSeconds ;
583+ if ( AutoCylPressurePSI < 0 )
584+ AutoCylPressurePSI = 0 ;
585+ }
586+ }
568587 }
569- else if ( loco . DynamicBrakeAutoBailOff && loco . DynamicBrakePercent > 0 && Car . MaxBrakeForceN > 0 )
588+ if ( loco . DynamicBrakeAutoBailOff && loco . DynamicBrakePercent > 0 && Car . MaxBrakeForceN > 0 )
570589 {
571- bailoff = true ;
572- var requiredBrakeForce = Math . Min ( AutoCylPressurePSI / MaxCylPressurePSI , 1 ) * Car . MaxBrakeForceN ;
573- var airBrakeForce = requiredBrakeForce - loco . DynamicBrakeForceN ;
574- var requiredCylPressure = Math . Max ( Math . Min ( airBrakeForce / Car . MaxBrakeForceN * MaxCylPressurePSI , AutoCylPressurePSI ) , 0 ) ;
575- if ( requiredCylPressure > CylPressurePSI )
576- CylPressurePSI = Math . Min ( requiredCylPressure , CylPressurePSI + MaxApplicationRatePSIpS * elapsedClockSeconds ) ;
577- if ( requiredCylPressure < CylPressurePSI )
578- CylPressurePSI = Math . Max ( requiredCylPressure , CylPressurePSI - MaxReleaseRatePSIpS * elapsedClockSeconds ) ;
590+ var requiredBrakeForceN = Math . Min ( AutoCylPressurePSI / MaxCylPressurePSI , 1 ) * Car . MaxBrakeForceN ;
591+ var localBrakeForceN = loco . DynamicBrakeForceN + Math . Min ( BrakeLine3PressurePSI / MaxCylPressurePSI , 1 ) * Car . MaxBrakeForceN ;
592+ if ( localBrakeForceN > requiredBrakeForceN * 0.85f )
593+ isolateAutoBrake = true ;
579594 }
580595 }
596+ if ( isolateAutoBrake )
597+ CylPressurePSI = BrakeLine3PressurePSI ;
598+ else
599+ CylPressurePSI = Math . Max ( AutoCylPressurePSI , BrakeLine3PressurePSI ) ;
600+ }
601+ else
602+ {
603+ CylPressurePSI = Math . Max ( AutoCylPressurePSI , BrakeLine3PressurePSI ) ;
581604 }
582- if ( ! bailoff )
583- CylPressurePSI = AutoCylPressurePSI ;
584- if ( CylPressurePSI < BrakeLine3PressurePSI ) // Brake Cylinder pressure will be the greater of engine brake pressure or train brake pressure
585- CylPressurePSI = BrakeLine3PressurePSI ;
586605 }
587606
588607 // During braking wheelslide control is effected throughout the train by additional equipment on each vehicle. In the piping to each pair of brake cylinders are fitted electrically operated
0 commit comments