@@ -381,6 +381,13 @@ public void Load()
381
381
float LoadFullRelayValveRatio ;
382
382
float LoadFullInshotPSI ;
383
383
384
+ // Used to avoid unnecessary brake mode changes. No need to Copy/Save/Restore them
385
+ BrakeModes PrevBrakeMode ;
386
+ float PrevBrakeMass = - 1 ;
387
+
388
+ // These settings may preceed the brake system type definition, which would cause them not to be parsed, that's why this workaround is needed.
389
+ ( float MaxBrakeForceN , float MaxHandbrakeForceN , float MaxBrakeShoeForceN ) ParsetimeBrakeForces ;
390
+
384
391
/// <summary>
385
392
/// This initializer is called when we haven't loaded this type of car before
386
393
/// and must read it new from the wag file.
@@ -642,11 +649,38 @@ public virtual void LoadFromWagFile(string wagFilePath)
642
649
if ( ! BrakeModeNames . Contains ( key . BrakeMode . ToString ( ) ) )
643
650
BrakeSystems . Remove ( key ) ;
644
651
}
645
- else
652
+ BrakeModeNames = BrakeSystems . Keys . Select ( k => k . BrakeMode . ToString ( ) ) . Distinct ( ) . ToArray ( ) ;
653
+ BrakeSystem = BrakeSystem ?? MSTSBrakeSystem . Create ( CarBrakeSystemType , this ) ;
654
+
655
+ BrakeSystem . InitialMaxBrakeForceN = ParsetimeBrakeForces . MaxBrakeForceN ;
656
+ BrakeSystem . InitialMaxHandbrakeForceN = ParsetimeBrakeForces . MaxHandbrakeForceN ;
657
+ BrakeSystem . MaxBrakeShoeForceN = ParsetimeBrakeForces . MaxBrakeShoeForceN ;
658
+
659
+ if ( BrakeSystem is AirSinglePipe airBrake )
646
660
{
647
- BrakeModeNames = BrakeSystems . Keys . Select ( k => k . ToString ( ) ) . ToArray ( ) ;
661
+ if ( BrakeSystems ? . Count > 0 )
662
+ {
663
+ foreach ( var key in BrakeSystems . Keys )
664
+ {
665
+ if ( BrakeSystems [ key ] is AirSinglePipe subSystem )
666
+ {
667
+ BrakeSystems . TryGetValue ( ( BrakeModes . P , key . MinMass ) , out var pMode ) ;
668
+ var pModeBrakeMass = ( pMode as AirSinglePipe ) ? . BrakeMass ;
669
+ if ( subSystem . BrakeMass == 0 && ( pModeBrakeMass == null || pModeBrakeMass == 0 ) )
670
+ {
671
+ // We will reverse calculate the brake mass from the brake forces
672
+ subSystem . MaxBrakeShoeForceN = BrakeSystem . MaxBrakeShoeForceN ;
673
+ subSystem . InitialMaxBrakeForceN = BrakeSystem . InitialMaxBrakeForceN ;
674
+ }
675
+ subSystem . BrakeMassToShoeForce ( pModeBrakeMass ) ;
676
+ }
677
+ }
678
+ }
679
+ else
680
+ {
681
+ airBrake . BrakeMassToShoeForce ( null ) ;
682
+ }
648
683
}
649
- BrakeSystem = BrakeSystem ?? MSTSBrakeSystem . Create ( CarBrakeSystemType , this ) ;
650
684
651
685
var ( brakeMode , maxMass ) = BrakeSystems ? . Count > 0 ? BrakeSystems . Keys . FirstOrDefault ( ) : default ;
652
686
SetBrakeSystemMode ( brakeMode , maxMass , forceSwitch : true ) ;
@@ -988,6 +1022,8 @@ public virtual void LoadFromWagFile(string wagFilePath)
988
1022
hiStageAir . RelayValveRatio = LoadFullRelayValveRatio ;
989
1023
loStageAir . RelayValveInshotPSI = LoadEmptyInshotPSI ;
990
1024
hiStageAir . RelayValveInshotPSI = LoadFullInshotPSI ;
1025
+ loStageAir . BrakeMassToShoeForce ( null ) ;
1026
+ hiStageAir . BrakeMassToShoeForce ( null ) ;
991
1027
}
992
1028
993
1029
BrakeSystems . Add ( ( BrakeSystem . BrakeMode , LoadEmptyMassKg ) , loStage ) ;
@@ -1008,9 +1044,12 @@ public virtual void LoadFromWagFile(string wagFilePath)
1008
1044
1009
1045
public void SetBrakeSystemMode ( BrakeModes mode , float massKg , bool forceSwitch = false )
1010
1046
{
1011
- if ( Math . Abs ( SpeedMpS ) > .1 && ! forceSwitch )
1047
+ if ( ( Math . Abs ( SpeedMpS ) > 0.1 || mode == PrevBrakeMode && massKg == PrevBrakeMass ) && ! forceSwitch )
1012
1048
return ;
1013
1049
1050
+ PrevBrakeMode = mode ;
1051
+ PrevBrakeMass = massKg ;
1052
+
1014
1053
if ( BrakeSystems ? . Count > 0 )
1015
1054
{
1016
1055
// 1) First get the values from the zero load stage / base stage
@@ -1025,7 +1064,7 @@ public void SetBrakeSystemMode(BrakeModes mode, float massKg, bool forceSwitch =
1025
1064
foreach ( var key in BrakeSystems . Keys )
1026
1065
if ( key . BrakeMode == mode && key . MinMass <= massKg )
1027
1066
max = Math . Max ( max , key . MinMass ) ;
1028
- if ( ( BrakeSystem . BrakeMode , BrakeSystem . LoadStageMinMassKg ) != ( mode , max ) && BrakeSystems . TryGetValue ( ( mode , max ) , out brakeSystem ) )
1067
+ if ( BrakeSystems . TryGetValue ( ( mode , max ) , out brakeSystem ) )
1029
1068
{
1030
1069
HandleIncompatibleBrakesystems ( brakeSystem ) ;
1031
1070
BrakeSystem . InitializeFromCopy ( brakeSystem , true ) ;
@@ -1327,6 +1366,9 @@ public virtual void Parse(string lowercasetoken, STFReader stf)
1327
1366
FrictionE2 = stf . ReadFloat ( STFReader . UNITS . None , null ) ;
1328
1367
stf . SkipRestOfBlock ( ) ;
1329
1368
; break ;
1369
+ case "wagon(maxbrakeforce" : ParsetimeBrakeForces . MaxBrakeForceN = stf . ReadFloatBlock ( STFReader . UNITS . Force , null ) ; break ;
1370
+ case "wagon(maxhandbrakeforce" : ParsetimeBrakeForces . MaxHandbrakeForceN = stf . ReadFloatBlock ( STFReader . UNITS . Force , null ) ; break ;
1371
+ case "wagon(ortsmaxbrakeshoeforce" : ParsetimeBrakeForces . MaxBrakeShoeForceN = stf . ReadFloatBlock ( STFReader . UNITS . Force , null ) ; break ;
1330
1372
case "wagon(brakesystemtype" :
1331
1373
CarBrakeSystemType = stf . ReadStringBlock ( null ) . ToLower ( ) ;
1332
1374
BrakeSystem = MSTSBrakeSystem . Create ( CarBrakeSystemType , this ) ;
0 commit comments