Skip to content

Commit b9ee9ca

Browse files
committed
devel
1 parent 9b94bf1 commit b9ee9ca

File tree

2 files changed

+43
-39
lines changed

2 files changed

+43
-39
lines changed

Source/Orts.Simulation/Simulation/RollingStocks/MSTSWagon.cs

Lines changed: 42 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -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("("))

Source/Orts.Simulation/Simulation/RollingStocks/TrainCar.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -545,10 +545,8 @@ public Direction Direction
545545
public BrakeSystem BrakeSystem;
546546
/// <summary>Alternative for dual vacuum/air vehicles, to be swapped with <see cref="BrakeSystem"/> and used directly</summary>
547547
protected BrakeSystem BrakeSystemAlt;
548-
/// <summary>Store for the various modes. Never used directly, only the non-zero values get copied into <see cref="BrakeSystem"/></summary>
549-
public readonly Dictionary<BrakeModes, BrakeSystem> BrakeSystems = new Dictionary<BrakeModes, BrakeSystem>();
550548
/// <summary>Store for the various loades within modes. Never used directly, only the non-zero values get copied into <see cref="BrakeSystem"/></summary>
551-
public readonly Dictionary<(BrakeModes BrakeMode, float MaxMass), BrakeSystem> BrakeLoadStages = new Dictionary<(BrakeModes, float), BrakeSystem>();
549+
public readonly Dictionary<(BrakeModes BrakeMode, float MaxMass), BrakeSystem> BrakeSystems = new Dictionary<(BrakeModes, float), BrakeSystem>();
552550
/// <summary>Filter for the <see cref="BrakeSystems"/>, in case that comes from an include file</summary>
553551
public string[] BrakeModeNames { get; protected set; }
554552
protected string BrakeModePreset;

0 commit comments

Comments
 (0)