Skip to content

Commit f29be1e

Browse files
committed
update sander
1 parent ab5ea99 commit f29be1e

File tree

3 files changed

+83
-39
lines changed

3 files changed

+83
-39
lines changed

Source/ORTS.Common/Conversions.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -732,6 +732,12 @@ public static string FormatVolume(float volumeM3, bool isMetric)
732732
return String.Format(CultureInfo.CurrentCulture, "{0:F0} {1}", volume, isMetric ? m3 : ft3);
733733
}
734734

735+
public static string FormatSmallVolume(float volumeM3, bool isMetric)
736+
{
737+
var volume = isMetric ? volumeM3 : Me3.ToFt3(volumeM3);
738+
return String.Format(CultureInfo.CurrentCulture, "{0:N3} {1}", volume, isMetric ? m3 : ft3);
739+
}
740+
735741
public static string FormatFuelVolume(float volumeL, bool isMetric, bool isUK)
736742
{
737743
var volume = isMetric ? volumeL : isUK ? L.ToGUK(volumeL) : L.ToGUS(volumeL);

Source/Orts.Simulation/Simulation/RollingStocks/MSTSLocomotive.cs

Lines changed: 45 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -251,16 +251,16 @@ public enum SlipControlType
251251

252252
// parameters for Track Sander based upon compressor air and abrasive table for 1/2" sand blasting nozzle @ 50psi
253253
public float MaxTrackSandBoxCapacityM3; // Capacity of sandbox
254-
public float TrackSanderAirComsumptionForwardM3pS;
255-
public float TrackSanderAirComsumptionReverseM3pS = 0;
256-
public float TrackSanderSandConsumptionForwardM3pS;
254+
public float MaxTrackSanderAirComsumptionForwardM3pS;
255+
public float MaxTrackSanderAirComsumptionReverseM3pS = 0;
256+
public float MaxTrackSanderSandConsumptionForwardM3pS;
257257
public float CurrentTrackSanderAirConsumptionM3pS;
258258
public float CurrentTrackSanderSandConsumptionM3pS;
259259
public float CurrentTrackSandBoxCapacityM3;
260-
public float TrackSanderSandConsumptionReverseM3pS = 0;
260+
public float MaxTrackSanderSandConsumptionReverseM3pS = 0;
261261
public float SandWeightKgpM3 = 1600; // One cubic metre of sand weighs about 1.54-1.78 tonnes.
262-
public float TrackSanderSteamConsumptionForwardLbpS;
263-
public float TrackSanderSteamConsumptionReverseLbpS = 0;
262+
public float MaxTrackSanderSteamConsumptionForwardLbpS;
263+
public float MaxTrackSanderSteamConsumptionReverseLbpS = 0;
264264

265265

266266
// Vacuum Braking parameters
@@ -1150,20 +1150,20 @@ public override void Parse(string lowercasetoken, STFReader stf)
11501150
MaxTrackSandBoxCapacityM3 = Me3.FromFt3(MaxTrackSandBoxCapacityM3);
11511151
break;
11521152
case "engine(ortsmaxtracksandersandconsumptionforward":
1153-
Me3.FromFt3( TrackSanderSandConsumptionForwardM3pS = stf.ReadFloatBlock(STFReader.UNITS.VolumeDefaultFT3, null) );
1154-
TrackSanderSandConsumptionForwardM3pS = Me3.FromFt3(TrackSanderSandConsumptionForwardM3pS);
1153+
Me3.FromFt3( MaxTrackSanderSandConsumptionForwardM3pS = stf.ReadFloatBlock(STFReader.UNITS.VolumeDefaultFT3, null) );
1154+
MaxTrackSanderSandConsumptionForwardM3pS = Me3.FromFt3(MaxTrackSanderSandConsumptionForwardM3pS);
11551155
break;
11561156
case "engine(ortsmaxtracksandersandconsumptionreverse":
1157-
Me3.FromFt3(TrackSanderSandConsumptionReverseM3pS = stf.ReadFloatBlock(STFReader.UNITS.VolumeDefaultFT3, null));
1158-
TrackSanderSandConsumptionReverseM3pS = Me3.FromFt3(TrackSanderSandConsumptionReverseM3pS);
1157+
Me3.FromFt3(MaxTrackSanderSandConsumptionReverseM3pS = stf.ReadFloatBlock(STFReader.UNITS.VolumeDefaultFT3, null));
1158+
MaxTrackSanderSandConsumptionReverseM3pS = Me3.FromFt3(MaxTrackSanderSandConsumptionReverseM3pS);
11591159
break;
11601160
case "engine(ortsmaxtracksanderairconsumptionforward":
1161-
Me3.FromFt3( TrackSanderAirComsumptionForwardM3pS = stf.ReadFloatBlock(STFReader.UNITS.VolumeDefaultFT3, null) );
1162-
TrackSanderAirComsumptionForwardM3pS = Me3.FromFt3(TrackSanderAirComsumptionForwardM3pS);
1161+
Me3.FromFt3( MaxTrackSanderAirComsumptionForwardM3pS = stf.ReadFloatBlock(STFReader.UNITS.VolumeDefaultFT3, null) );
1162+
MaxTrackSanderAirComsumptionForwardM3pS = Me3.FromFt3(MaxTrackSanderAirComsumptionForwardM3pS);
11631163
break;
11641164
case "engine(ortsmaxtracksanderairconsumptionreverse":
1165-
Me3.FromFt3(TrackSanderAirComsumptionReverseM3pS = stf.ReadFloatBlock(STFReader.UNITS.VolumeDefaultFT3, null));
1166-
TrackSanderAirComsumptionReverseM3pS = Me3.FromFt3(TrackSanderAirComsumptionReverseM3pS);
1165+
Me3.FromFt3(MaxTrackSanderAirComsumptionReverseM3pS = stf.ReadFloatBlock(STFReader.UNITS.VolumeDefaultFT3, null));
1166+
MaxTrackSanderAirComsumptionReverseM3pS = Me3.FromFt3(MaxTrackSanderAirComsumptionReverseM3pS);
11671167
break;
11681168
case "engine(ortscruisecontrol": SetUpCruiseControl(stf); break;
11691169
case "engine(ortsmultipositioncontroller": SetUpMPC(stf); break;
@@ -1221,10 +1221,10 @@ public override void Copy(MSTSWagon copy)
12211221
SanderSpeedEffectUpToMpS = locoCopy.SanderSpeedEffectUpToMpS;
12221222
SanderSpeedOfMpS = locoCopy.SanderSpeedOfMpS;
12231223
MaxTrackSandBoxCapacityM3 = locoCopy.MaxTrackSandBoxCapacityM3;
1224-
TrackSanderSandConsumptionForwardM3pS = locoCopy.TrackSanderSandConsumptionForwardM3pS;
1225-
TrackSanderSandConsumptionReverseM3pS = locoCopy.TrackSanderSandConsumptionReverseM3pS;
1226-
TrackSanderAirComsumptionForwardM3pS = locoCopy.TrackSanderAirComsumptionForwardM3pS;
1227-
TrackSanderAirComsumptionReverseM3pS = locoCopy.TrackSanderAirComsumptionReverseM3pS;
1224+
MaxTrackSanderSandConsumptionForwardM3pS = locoCopy.MaxTrackSanderSandConsumptionForwardM3pS;
1225+
MaxTrackSanderSandConsumptionReverseM3pS = locoCopy.MaxTrackSanderSandConsumptionReverseM3pS;
1226+
MaxTrackSanderAirComsumptionForwardM3pS = locoCopy.MaxTrackSanderAirComsumptionForwardM3pS;
1227+
MaxTrackSanderAirComsumptionReverseM3pS = locoCopy.MaxTrackSanderAirComsumptionReverseM3pS;
12281228
PowerOnDelayS = locoCopy.PowerOnDelayS;
12291229
DoesHornTriggerBell = locoCopy.DoesHornTriggerBell;
12301230
MaxSteamHeatPressurePSI = locoCopy.MaxSteamHeatPressurePSI;
@@ -1331,7 +1331,6 @@ public override void Save(BinaryWriter outf)
13311331
outf.Write(PowerReduction);
13321332
outf.Write(ScoopIsBroken);
13331333
outf.Write(IsWaterScoopDown);
1334-
outf.Write(CurrentTrackSandBoxCapacityM3);
13351334
outf.Write(SaveAdhesionFilter);
13361335
outf.Write(GenericItem1);
13371336
outf.Write(GenericItem2);
@@ -1341,6 +1340,10 @@ public override void Save(BinaryWriter outf)
13411340
outf.Write(previousChangedGearBoxNotch);
13421341
outf.Write(DynamicBrake);
13431342
outf.Write(DynamicBrakeIntervention);
1343+
outf.Write(CurrentTrackSandBoxCapacityM3);
1344+
outf.Write(CurrentTrackSanderSandConsumptionM3pS);
1345+
outf.Write(CurrentTrackSanderAirConsumptionM3pS);
1346+
13441347

13451348
base.Save(outf);
13461349

@@ -1383,7 +1386,6 @@ public override void Restore(BinaryReader inf)
13831386
PowerReduction = inf.ReadSingle();
13841387
ScoopIsBroken = inf.ReadBoolean();
13851388
IsWaterScoopDown = inf.ReadBoolean();
1386-
CurrentTrackSandBoxCapacityM3 = inf.ReadSingle();
13871389

13881390
SaveAdhesionFilter = inf.ReadSingle();
13891391

@@ -1398,6 +1400,9 @@ public override void Restore(BinaryReader inf)
13981400

13991401
DynamicBrake = inf.ReadBoolean();
14001402
DynamicBrakeIntervention = inf.ReadSingle();
1403+
CurrentTrackSandBoxCapacityM3 = inf.ReadSingle();
1404+
CurrentTrackSanderSandConsumptionM3pS = inf.ReadSingle();
1405+
CurrentTrackSanderAirConsumptionM3pS = inf.ReadSingle();
14011406

14021407
base.Restore(inf);
14031408

@@ -1773,19 +1778,19 @@ public override void Initialize()
17731778
MaxTrackSandBoxCapacityM3 = Me3.FromFt3(40.0f); // Capacity of sandbox - assume 40.0 cu ft
17741779
}
17751780

1776-
if (TrackSanderAirComsumptionForwardM3pS == 0)
1781+
if (MaxTrackSanderAirComsumptionForwardM3pS == 0 && SandingSystemType == SandingSystemTypes.Air)
17771782
{
1778-
TrackSanderAirComsumptionForwardM3pS = Me3.FromFt3(56.0f) / 60.0f; // Default value - cubic feet per min (CFM) 28 ft3/m x 2 sanders @ 140 psi - convert to /sec values
1783+
MaxTrackSanderAirComsumptionForwardM3pS = Me3.FromFt3(56.0f) / 60.0f; // Default value - cubic feet per min (CFM) 28 ft3/m x 2 sanders @ 140 psi - convert to /sec values
17791784
}
17801785

1781-
if (TrackSanderSandConsumptionForwardM3pS == 0)
1786+
if (MaxTrackSanderSandConsumptionForwardM3pS == 0)
17821787
{
1783-
TrackSanderSandConsumptionForwardM3pS = Me3.FromFt3(3.4f) / 3600.0f; // Default value - 1.7 ft3/h x 2 sanders @ 140 psi - convert to /sec values
1788+
MaxTrackSanderSandConsumptionForwardM3pS = Me3.FromFt3(3.4f) / 3600.0f; // Default value - 1.7 ft3/h x 2 sanders @ 140 psi - convert to /sec values
17841789
}
17851790

1786-
if (TrackSanderSteamConsumptionForwardLbpS == 0 && SandingSystemType == SandingSystemTypes.Steam)
1791+
if (MaxTrackSanderSteamConsumptionForwardLbpS == 0 && SandingSystemType == SandingSystemTypes.Steam)
17871792
{
1788-
TrackSanderSteamConsumptionForwardLbpS = 300f / 3600f; // Default value - 300lbs/hr - this value is un confirmed at this stage.
1793+
MaxTrackSanderSteamConsumptionForwardLbpS = 300f / 3600f; // Default value - 300lbs/hr - this value is un confirmed at this stage.
17891794
}
17901795

17911796
base.Initialize();
@@ -3270,13 +3275,13 @@ public void UpdateTrackSander(float elapsedClockSeconds)
32703275

32713276
if (Direction == Direction.Reverse)
32723277
{
3273-
sandingSteamConsumptionLbpS = TrackSanderSteamConsumptionReverseLbpS;
3274-
sandingSandConsumptionM3pS = TrackSanderSandConsumptionReverseM3pS;
3278+
sandingSteamConsumptionLbpS = MaxTrackSanderSteamConsumptionReverseLbpS;
3279+
sandingSandConsumptionM3pS = MaxTrackSanderSandConsumptionReverseM3pS;
32753280
}
32763281
else
32773282
{
3278-
sandingSteamConsumptionLbpS = TrackSanderSteamConsumptionForwardLbpS;
3279-
sandingSandConsumptionM3pS = TrackSanderSandConsumptionForwardM3pS;
3283+
sandingSteamConsumptionLbpS = MaxTrackSanderSteamConsumptionForwardLbpS;
3284+
sandingSandConsumptionM3pS = MaxTrackSanderSandConsumptionForwardM3pS;
32803285
}
32813286

32823287
// Calculate steam consumption
@@ -3302,13 +3307,13 @@ public void UpdateTrackSander(float elapsedClockSeconds)
33023307

33033308
if (Direction == Direction.Reverse)
33043309
{
3305-
sandingAirConsumptionM3pS = TrackSanderAirComsumptionReverseM3pS;
3306-
sandingSandConsumptionM3pS = TrackSanderSandConsumptionReverseM3pS;
3310+
sandingAirConsumptionM3pS = MaxTrackSanderAirComsumptionReverseM3pS;
3311+
sandingSandConsumptionM3pS = MaxTrackSanderSandConsumptionReverseM3pS;
33073312
}
33083313
else
33093314
{
3310-
sandingAirConsumptionM3pS = TrackSanderAirComsumptionForwardM3pS;
3311-
sandingSandConsumptionM3pS = TrackSanderSandConsumptionForwardM3pS;
3315+
sandingAirConsumptionM3pS = MaxTrackSanderAirComsumptionForwardM3pS;
3316+
sandingSandConsumptionM3pS = MaxTrackSanderSandConsumptionForwardM3pS;
33123317
}
33133318

33143319
// Calculate air consumption and change in main air reservoir pressure
@@ -3331,7 +3336,12 @@ public void UpdateTrackSander(float elapsedClockSeconds)
33313336
}
33323337
}
33333338
}
3334-
3339+
else // reset to zero if sander is off
3340+
{
3341+
CurrentTrackSanderSandConsumptionM3pS = 0;
3342+
CurrentTrackSanderAirConsumptionM3pS = 0;
3343+
SandingSteamUsageLBpS = 0;
3344+
}
33353345
}
33363346

33373347
public override bool GetSanderOn()

Source/Orts.Simulation/Simulation/RollingStocks/MSTSSteamLocomotive.cs

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -889,6 +889,12 @@ public override void Parse(string lowercasetoken, STFReader stf)
889889
MSTSNumCylinders = stf.ReadIntBlock(null); break; // retained for legacy purposes
890890
case "engine(numberofcylinders":
891891
MSTSNumCylinders = stf.ReadIntBlock(null); break;
892+
case "engine(ortsmaxtracksandersteamconsumptionforward":
893+
Me3.FromFt3(MaxTrackSanderSteamConsumptionForwardLbpS = stf.ReadFloatBlock(STFReader.UNITS.Mass, null));
894+
break;
895+
case "engine(ortsmaxtracksandersteamconsumptionreverse":
896+
Me3.FromFt3(MaxTrackSanderSteamConsumptionReverseLbpS = stf.ReadFloatBlock(STFReader.UNITS.Mass, null));
897+
break;
892898
case "engine(cylinderstroke": MSTSCylinderStrokeM = stf.ReadFloatBlock(STFReader.UNITS.Distance, null); break;
893899
case "engine(cylinderdiameter": MSTSCylinderDiameterM = stf.ReadFloatBlock(STFReader.UNITS.Distance, null); break;
894900
case "engine(lpnumcylinders": MSTSLPNumCylinders = stf.ReadIntBlock(null); break;
@@ -1014,6 +1020,8 @@ public override void Copy(MSTSWagon copy)
10141020
MaxSuperheatRefTempF = locoCopy.MaxSuperheatRefTempF;
10151021
MaxIndicatedHorsePowerHP = locoCopy.MaxIndicatedHorsePowerHP;
10161022
SuperheatCutoffPressureFactor = locoCopy.SuperheatCutoffPressureFactor;
1023+
MaxTrackSanderSteamConsumptionForwardLbpS = locoCopy.MaxTrackSanderSteamConsumptionForwardLbpS;
1024+
MaxTrackSanderSteamConsumptionReverseLbpS = locoCopy.MaxTrackSanderSteamConsumptionReverseLbpS;
10171025
EjectorSmallSteamConsumptionLbpS = locoCopy.EjectorSmallSteamConsumptionLbpS;
10181026
EjectorLargeSteamConsumptionLbpS = locoCopy.EjectorLargeSteamConsumptionLbpS;
10191027
ShovelMassKG = locoCopy.ShovelMassKG;
@@ -1111,6 +1119,7 @@ public override void Save(BinaryWriter outf)
11111119
outf.Write(EvaporationLBpS);
11121120
outf.Write(FireMassKG);
11131121
outf.Write(FlueTempK);
1122+
outf.Write(SandingSteamUsageLBpS);
11141123
outf.Write(SteamGearPosition);
11151124
ControllerFactory.Save(CutoffController, outf);
11161125
ControllerFactory.Save(Injector1Controller, outf);
@@ -1174,6 +1183,7 @@ public override void Restore(BinaryReader inf)
11741183
EvaporationLBpS = inf.ReadSingle();
11751184
FireMassKG = inf.ReadSingle();
11761185
FlueTempK = inf.ReadSingle();
1186+
SandingSteamUsageLBpS = inf.ReadSingle();
11771187
SteamGearPosition = inf.ReadSingle();
11781188
ControllerFactory.Restore(CutoffController, inf);
11791189
ControllerFactory.Restore(Injector1Controller, inf);
@@ -8003,17 +8013,35 @@ public override string GetDebugStatus()
80038013
SteamEngines[i].CalculatedFactorOfAdhesion);
80048014
}
80058015

8006-
status.AppendFormat("{0}\t{1}\t{2:N2}\t{3}\t{4:N8}/{9}\t\t{5}\t{6:N3}/{9}\t{7}\t{8:N1}\n",
8016+
if (SandingSystemType == SandingSystemTypes.Steam)
8017+
{
8018+
status.AppendFormat("{0}\t{1}\t{22}\t{3}\t{4}/{7}\t\t{5}\t{6}/{7}\n",
8019+
Simulator.Catalog.GetString("Sand:"),
8020+
Simulator.Catalog.GetString("S/Box"),
8021+
FormatStrings.FormatVolume(CurrentTrackSandBoxCapacityM3, IsMetric),
8022+
Simulator.Catalog.GetString("S/Use"),
8023+
FormatStrings.FormatSmallVolume(pS.TopH(CurrentTrackSanderSandConsumptionM3pS), IsMetric),
8024+
Simulator.Catalog.GetString("St/Use"),
8025+
FormatStrings.FormatMass(pS.TopH(SandingSteamUsageLBpS), IsMetric),
8026+
FormatStrings.h);
8027+
8028+
}
8029+
else
8030+
{
8031+
8032+
status.AppendFormat("{0}\t{1}\t{2}\t{3}\t{4}/{9}\t\t{5}\t{6}/{9}\t\t{7}\t{8:N1}\n",
80078033
Simulator.Catalog.GetString("Sand:"),
80088034
Simulator.Catalog.GetString("S/Box"),
80098035
FormatStrings.FormatVolume(CurrentTrackSandBoxCapacityM3, IsMetric),
80108036
Simulator.Catalog.GetString("S/Use"),
8011-
FormatStrings.FormatVolume(pS.TopM(CurrentTrackSanderSandConsumptionM3pS), IsMetric),
8037+
FormatStrings.FormatSmallVolume(pS.TopH(CurrentTrackSanderSandConsumptionM3pS), IsMetric),
80128038
Simulator.Catalog.GetString("A/Use"),
8013-
FormatStrings.FormatVolume(pS.TopM(CurrentTrackSanderAirConsumptionM3pS), IsMetric),
8039+
FormatStrings.FormatSmallVolume(pS.TopH(CurrentTrackSanderAirConsumptionM3pS), IsMetric),
80148040
Simulator.Catalog.GetString("M/Press"),
80158041
MainResPressurePSI,
8016-
FormatStrings.min);
8042+
FormatStrings.h);
8043+
8044+
}
80178045

80188046
status.AppendFormat("\n{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}\t{7}\t{8}\n",
80198047
Simulator.Catalog.GetString("CylE:"),

0 commit comments

Comments
 (0)