@@ -1045,30 +1045,6 @@ public virtual void LoadFromWagFile(string wagFilePath)
10451045 Trace . TraceInformation ( "Empty Values = Brake {0} Handbrake {1} DavisA {2} DavisB {3} DavisC {4} CoGY {5}" , LoadEmptyMaxBrakeForceN , LoadEmptyMaxHandbrakeForceN , LoadEmptyORTSDavis_A , LoadEmptyORTSDavis_B , LoadEmptyORTSDavis_C , LoadEmptyCentreOfGravityM_Y ) ;
10461046 Trace . TraceInformation ( "Full Values = Brake {0} Handbrake {1} DavisA {2} DavisB {3} DavisC {4} CoGY {5}" , LoadFullMaxBrakeForceN , LoadFullMaxHandbrakeForceN , LoadFullORTSDavis_A , LoadFullORTSDavis_B , LoadFullORTSDavis_C , LoadFullCentreOfGravityM_Y ) ;
10471047#endif
1048-
1049- // The FreightAnim-style brake parameters cannot support switchable states, so use them only in case there are none of those
1050- if ( BrakeSystems . Count <= 1 && BrakeLoadStages . Count == 0 )
1051- {
1052- var loStage = BrakeSystem . CreateNewLike ( BrakeSystem , this ) . InitializeDefault ( ) ;
1053- var hiStage = BrakeSystem . CreateNewLike ( BrakeSystem , this ) . InitializeDefault ( ) ;
1054- if ( loStage != null && hiStage != null )
1055- {
1056- loStage . InitialMaxBrakeForceN = LoadEmptyMaxBrakeForceN ;
1057- hiStage . InitialMaxBrakeForceN = LoadFullMaxBrakeForceN ;
1058- loStage . InitialMaxHandbrakeForceN = LoadEmptyMaxHandbrakeForceN ;
1059- hiStage . InitialMaxHandbrakeForceN = LoadFullMaxHandbrakeForceN ;
1060-
1061- if ( loStage is AirSinglePipe loStageAir && hiStage is AirSinglePipe hiStageAir )
1062- {
1063- loStageAir . RelayValveRatio = LoadEmptyRelayValveRatio ;
1064- hiStageAir . RelayValveRatio = LoadFullRelayValveRatio ;
1065- loStageAir . RelayValveInshotPSI = LoadEmptyInshotPSI ;
1066- hiStageAir . RelayValveInshotPSI = LoadFullInshotPSI ;
1067- }
1068- }
1069- BrakeLoadStages . Add ( ( BrakeSystem . BrakeMode , InitialMassKG ) , loStage ) ;
1070- BrakeLoadStages . Add ( ( BrakeSystem . BrakeMode , MassKG ) , hiStage ) ;
1071- }
10721048 }
10731049
10741050 // Determine whether or not to use the Davis friction model. Must come after freight animations are initialized.
@@ -1104,20 +1080,50 @@ public virtual void LoadFromWagFile(string wagFilePath)
11041080 }
11051081 }
11061082 BrakeSystem = BrakeSystem ?? MSTSBrakeSystem . Create ( CarBrakeSystemType , this ) ;
1107- SetBrakeSystemMode ( BrakeSystems . Keys . FirstOrDefault ( ) . ToString ( ) ) ;
1083+
1084+ if ( FreightAnimations != null && BrakeSystems . Count <= 1 )
1085+ {
1086+ // The FreightAnim-style brake parameters cannot support switchable states, so use them only in case there are none configured
1087+ var loStage = BrakeSystem . CreateNewLike ( BrakeSystem , this ) . InitializeDefault ( ) ;
1088+ var hiStage = BrakeSystem . CreateNewLike ( BrakeSystem , this ) . InitializeDefault ( ) ;
1089+ if ( loStage != null && hiStage != null )
1090+ {
1091+ loStage . InitialMaxBrakeForceN = LoadEmptyMaxBrakeForceN ;
1092+ hiStage . InitialMaxBrakeForceN = LoadFullMaxBrakeForceN ;
1093+ loStage . InitialMaxHandbrakeForceN = LoadEmptyMaxHandbrakeForceN ;
1094+ hiStage . InitialMaxHandbrakeForceN = LoadFullMaxHandbrakeForceN ;
1095+
1096+ if ( loStage is AirSinglePipe loStageAir && hiStage is AirSinglePipe hiStageAir )
1097+ {
1098+ loStageAir . RelayValveRatio = LoadEmptyRelayValveRatio ;
1099+ hiStageAir . RelayValveRatio = LoadFullRelayValveRatio ;
1100+ loStageAir . RelayValveInshotPSI = LoadEmptyInshotPSI ;
1101+ hiStageAir . RelayValveInshotPSI = LoadFullInshotPSI ;
1102+ }
1103+ }
1104+ BrakeSystems . Add ( ( BrakeSystem . BrakeMode , InitialMassKG ) , loStage ) ;
1105+ BrakeSystems . Add ( ( BrakeSystem . BrakeMode , MassKG ) , hiStage ) ;
1106+ }
1107+ var mode = BrakeSystems . Keys . FirstOrDefault ( ) ;
1108+ SetBrakeSystemMode ( mode . BrakeMode , mode . MaxMass ) ;
11081109
11091110 MaxHandbrakeForceN = BrakeSystem . InitialMaxHandbrakeForceN ;
11101111 FrictionBrakeBlendingMaxForceN = BrakeSystem . InitialMaxBrakeForceN ; // set the value of braking when blended with dynamic brakes
11111112 UpdateBrakeLoadCompensation ( TempMassDiffRatio ) ;
11121113 UpdateDavisLoadCompensation ( TempMassDiffRatio ) ;
11131114 }
11141115
1115- public void SetBrakeSystemMode ( string mode )
1116+ public void SetBrakeSystemMode ( BrakeModes mode , float massKg )
11161117 {
1117- if ( Math . Abs ( SpeedMpS ) > .1 )
1118+ if ( Math . Abs ( SpeedMpS ) > .1 || BrakeSystems . Count == 0 )
11181119 return ;
11191120
1120- if ( ! string . IsNullOrWhiteSpace ( mode ) && Enum . TryParse ( mode , out BrakeModes modeEnum ) && BrakeSystems . TryGetValue ( modeEnum , out var brakeSystem ) )
1121+ var max = 0f ;
1122+ foreach ( var key in BrakeSystems . Keys )
1123+ if ( massKg < key . MaxMass && key . BrakeMode == mode )
1124+ max = Math . Max ( max , key . MaxMass ) ;
1125+
1126+ if ( BrakeSystems . TryGetValue ( ( mode , max ) , out var brakeSystem ) )
11211127 {
11221128 if ( brakeSystem is VacuumSinglePipe ^ BrakeSystem is VacuumSinglePipe )
11231129 {
@@ -1431,10 +1437,10 @@ public virtual void Parse(string lowercasetoken, STFReader stf)
14311437 if ( newSystem != null )
14321438 {
14331439 newSystem . BrakeMode = brakeModeName . Value ;
1434- if ( BrakeSystems . ContainsKey ( newSystem . BrakeMode ) )
1435- BrakeSystems [ newSystem . BrakeMode ] = newSystem ;
1440+ if ( BrakeSystems . ContainsKey ( ( newSystem . BrakeMode , 0 ) ) )
1441+ BrakeSystems [ ( newSystem . BrakeMode , 0 ) ] = newSystem ;
14361442 else
1437- BrakeSystems . Add ( newSystem . BrakeMode , newSystem ) ;
1443+ BrakeSystems . Add ( ( newSystem . BrakeMode , 0 ) , newSystem ) ;
14381444 }
14391445 }
14401446 break ;
@@ -1445,10 +1451,10 @@ public virtual void Parse(string lowercasetoken, STFReader stf)
14451451 if ( brakeModeName != null )
14461452 {
14471453 newSystem . BrakeMode = brakeModeName . Value ;
1448- if ( BrakeSystems . ContainsKey ( newSystem . BrakeMode ) )
1449- BrakeSystems [ newSystem . BrakeMode ] = newSystem ;
1454+ if ( BrakeSystems . ContainsKey ( ( newSystem . BrakeMode , 0 ) ) )
1455+ BrakeSystems [ ( newSystem . BrakeMode , 0 ) ] = newSystem ;
14501456 else
1451- BrakeSystems . Add ( newSystem . BrakeMode , newSystem ) ;
1457+ BrakeSystems . Add ( ( newSystem . BrakeMode , 0 ) , newSystem ) ;
14521458 }
14531459 break ;
14541460 case "wagon(ortsbrakemode(ortsloadstage" :
@@ -1463,8 +1469,8 @@ public virtual void Parse(string lowercasetoken, STFReader stf)
14631469 {
14641470 case "wagon(ortsbrakemode(ortsloadstage(ortsloadstagemaxmass" :
14651471 maxMass = stf . ReadFloatBlock ( STFReader . UNITS . Mass , null ) ;
1466- if ( ! BrakeLoadStages . ContainsKey ( ( newSystem . BrakeMode , maxMass . Value ) ) )
1467- BrakeLoadStages . Add ( ( newSystem . BrakeMode , maxMass . Value ) , stage ) ;
1472+ if ( ! BrakeSystems . ContainsKey ( ( newSystem . BrakeMode , maxMass . Value ) ) )
1473+ BrakeSystems . Add ( ( newSystem . BrakeMode , maxMass . Value ) , stage ) ;
14681474 break ;
14691475 default :
14701476 if ( lowercasetoken . EndsWith ( "(" ) )
0 commit comments