Skip to content

Commit 01a5cec

Browse files
committed
separate TCS update function into subroutines
1 parent 824701d commit 01a5cec

File tree

1 file changed

+55
-47
lines changed

1 file changed

+55
-47
lines changed

Source/Orts.Simulation/Simulation/RollingStocks/SubSystems/TrainControlSystem.cs

Lines changed: 55 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1084,53 +1084,8 @@ public override void Update()
10841084

10851085
SetPenaltyApplicationDisplay(IsBrakeEmergency() || IsBrakeFullService());
10861086

1087-
// Update monitoring status
1088-
if (SpeedMpS() > CurrentSpeedLimitMpS)
1089-
{
1090-
if (OverspeedMonitor != null && (OverspeedMonitor.AppliesEmergencyBrake || OverspeedMonitor.AppliesFullBrake))
1091-
Status = MonitoringStatus.Intervention;
1092-
else
1093-
Status = MonitoringStatus.Warning;
1094-
}
1095-
else if (NextSpeedLimitMpS < CurrentSpeedLimitMpS && SpeedMpS() > NextSpeedLimitMpS)
1096-
{
1097-
if (Deceleration(SpeedMpS(), NextSpeedLimitMpS, NextSignalDistanceM(0)) > 0.7f)
1098-
Status = MonitoringStatus.Overspeed;
1099-
else
1100-
Status = MonitoringStatus.Indication;
1101-
}
1102-
else
1103-
Status = MonitoringStatus.Normal;
1104-
SetMonitoringStatus(Status);
1105-
1106-
// Provide basic functionality for ETCS DMI planning area
1107-
float maxDistanceAheadM = 0;
1108-
ETCSStatus.SpeedTargets.Clear();
1109-
ETCSStatus.SpeedTargets.Add(new PlanningTarget(0, CurrentSpeedLimitMpS));
1110-
for (int i=0; i<5; i++)
1111-
{
1112-
maxDistanceAheadM = NextSignalDistanceM(i);
1113-
if (NextSignalAspect(i) == Aspect.Stop || NextSignalAspect(i) == Aspect.None) break;
1114-
float speedLimMpS = NextSignalSpeedLimitMpS(i);
1115-
if (speedLimMpS >= 0) ETCSStatus.SpeedTargets.Add(new PlanningTarget(maxDistanceAheadM, speedLimMpS));
1116-
}
1117-
float prevDist = 0;
1118-
float prevSpeed = 0;
1119-
for (int i=0; i<10; i++)
1120-
{
1121-
float distanceM = NextPostDistanceM(i);
1122-
if (distanceM >= maxDistanceAheadM) break;
1123-
float speed = NextPostSpeedLimitMpS(i);
1124-
if (speed == prevSpeed || distanceM - prevDist < 10) continue;
1125-
ETCSStatus.SpeedTargets.Add(new PlanningTarget(distanceM, speed));
1126-
prevDist = distanceM;
1127-
prevSpeed = speed;
1128-
}
1129-
ETCSStatus.SpeedTargets.Sort((x, y) => x.DistanceToTrainM.CompareTo(y.DistanceToTrainM));
1130-
ETCSStatus.SpeedTargets.Add(new PlanningTarget(maxDistanceAheadM, 0));
1131-
ETCSStatus.GradientProfile.Clear();
1132-
ETCSStatus.GradientProfile.Add(new GradientProfileElement(0, (int)(CurrentGradientPercent() * 10)));
1133-
ETCSStatus.GradientProfile.Add(new GradientProfileElement(maxDistanceAheadM, 0)); // End of profile
1087+
UpdateMonitoringStatus();
1088+
UpdateETCSPlanning();
11341089
}
11351090
}
11361091

@@ -1149,6 +1104,59 @@ public void UpdateInputs()
11491104
SetNextSpeedLimitMpS(NextSpeedLimitMpS);
11501105
}
11511106

1107+
private void UpdateMonitoringStatus()
1108+
{
1109+
if (SpeedMpS() > CurrentSpeedLimitMpS)
1110+
{
1111+
if (OverspeedMonitor != null && (OverspeedMonitor.AppliesEmergencyBrake || OverspeedMonitor.AppliesFullBrake))
1112+
Status = MonitoringStatus.Intervention;
1113+
else
1114+
Status = MonitoringStatus.Warning;
1115+
}
1116+
else if (NextSpeedLimitMpS < CurrentSpeedLimitMpS && SpeedMpS() > NextSpeedLimitMpS)
1117+
{
1118+
if (Deceleration(SpeedMpS(), NextSpeedLimitMpS, NextSignalDistanceM(0)) > 0.7f)
1119+
Status = MonitoringStatus.Overspeed;
1120+
else
1121+
Status = MonitoringStatus.Indication;
1122+
}
1123+
else
1124+
Status = MonitoringStatus.Normal;
1125+
SetMonitoringStatus(Status);
1126+
}
1127+
1128+
// Provide basic functionality for ETCS DMI planning area
1129+
private void UpdateETCSPlanning()
1130+
{
1131+
float maxDistanceAheadM = 0;
1132+
ETCSStatus.SpeedTargets.Clear();
1133+
ETCSStatus.SpeedTargets.Add(new PlanningTarget(0, CurrentSpeedLimitMpS));
1134+
for (int i=0; i<5; i++)
1135+
{
1136+
maxDistanceAheadM = NextSignalDistanceM(i);
1137+
if (NextSignalAspect(i) == Aspect.Stop || NextSignalAspect(i) == Aspect.None) break;
1138+
float speedLimMpS = NextSignalSpeedLimitMpS(i);
1139+
if (speedLimMpS >= 0) ETCSStatus.SpeedTargets.Add(new PlanningTarget(maxDistanceAheadM, speedLimMpS));
1140+
}
1141+
float prevDist = 0;
1142+
float prevSpeed = 0;
1143+
for (int i=0; i<10; i++)
1144+
{
1145+
float distanceM = NextPostDistanceM(i);
1146+
if (distanceM >= maxDistanceAheadM) break;
1147+
float speed = NextPostSpeedLimitMpS(i);
1148+
if (speed == prevSpeed || distanceM - prevDist < 10) continue;
1149+
ETCSStatus.SpeedTargets.Add(new PlanningTarget(distanceM, speed));
1150+
prevDist = distanceM;
1151+
prevSpeed = speed;
1152+
}
1153+
ETCSStatus.SpeedTargets.Sort((x, y) => x.DistanceToTrainM.CompareTo(y.DistanceToTrainM));
1154+
ETCSStatus.SpeedTargets.Add(new PlanningTarget(maxDistanceAheadM, 0));
1155+
ETCSStatus.GradientProfile.Clear();
1156+
ETCSStatus.GradientProfile.Add(new GradientProfileElement(0, (int)(CurrentGradientPercent() * 10)));
1157+
ETCSStatus.GradientProfile.Add(new GradientProfileElement(maxDistanceAheadM, 0)); // End of profile
1158+
}
1159+
11521160
public override void HandleEvent(TCSEvent evt, string message)
11531161
{
11541162
switch(evt)

0 commit comments

Comments
 (0)