diff --git a/Source/Orts.Simulation/Simulation/Timetables/ProcessTimetable.cs b/Source/Orts.Simulation/Simulation/Timetables/ProcessTimetable.cs index 7dfc2741f7..6003c1d7b0 100644 --- a/Source/Orts.Simulation/Simulation/Timetables/ProcessTimetable.cs +++ b/Source/Orts.Simulation/Simulation/Timetables/ProcessTimetable.cs @@ -3176,9 +3176,11 @@ public enum SignalHoldType public string StopName; public int arrivalTime; public int departureTime; + public int passTime; public DateTime arrivalDT; public DateTime departureDT; - public bool arrdepvalid; + public DateTime passDT; + public bool arrdeppassvalid; public SignalHoldType holdState; public bool noWaitSignal; // public int passageTime; // not yet implemented @@ -3199,17 +3201,34 @@ public StopInfo(string name, string arrTime, string depTime, TimetableInfo ttinf refTTInfo = ttinfo; arrivalTime = -1; departureTime = -1; + passTime = -1; Commands = null; TimeSpan atime; bool validArrTime = false; bool validDepTime = false; + bool validPassTime = false; - validArrTime = TimeSpan.TryParse(arrTime, out atime); - if (validArrTime) + if (arrTime.Contains("P")) { - arrivalTime = Convert.ToInt32(atime.TotalSeconds); - arrivalDT = new DateTime(atime.Ticks); + string passingTime = arrTime.Replace('P', ':'); + validPassTime = TimeSpan.TryParse(passingTime, out atime); + + if (validPassTime) + { + passTime = Convert.ToInt32(atime.TotalSeconds); + passDT = new DateTime(atime.Ticks); + } + } + else + { + + validArrTime = TimeSpan.TryParse(arrTime, out atime); + if (validArrTime) + { + arrivalTime = Convert.ToInt32(atime.TotalSeconds); + arrivalDT = new DateTime(atime.Ticks); + } } validDepTime = TimeSpan.TryParse(depTime, out atime); @@ -3219,7 +3238,7 @@ public StopInfo(string name, string arrTime, string depTime, TimetableInfo ttinf departureDT = new DateTime(atime.Ticks); } - arrdepvalid = (validArrTime || validDepTime); + arrdeppassvalid = (validArrTime || validDepTime); StopName = String.Copy(name.ToLower()); } @@ -3236,8 +3255,8 @@ public bool BuildStopInfo(TTTrain actTrain, int actPlatformID, Signals signalRef { bool validStop = false; - // valid stop - if (arrdepvalid) + // valid stop and not passing + if (arrdeppassvalid && passTime < 0) { // check for station flags bool terminal = false; @@ -3491,6 +3510,12 @@ public bool BuildStopInfo(TTTrain actTrain, int actPlatformID, Signals signalRef } } + // pass time only - valid condition but not yet processed + if (!validStop && passTime >= 0) + { + validStop = true; + } + return (validStop); } // end buildStopInfo