Skip to content

Commit 4104e5f

Browse files
committed
Allow Depart Early
1 parent ebafd5d commit 4104e5f

File tree

3 files changed

+49
-14
lines changed

3 files changed

+49
-14
lines changed

Source/Orts.Simulation/Simulation/Physics/Train.cs

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13255,6 +13255,7 @@ public bool CreateStationStop(int platformStartID, int arrivalTime, int departTi
1325513255
false,
1325613256
false,
1325713257
false,
13258+
false,
1325813259
StationStop.STOPTYPE.STATION_STOP);
1325913260

1326013261
thisStation.arrivalDT = arrivalDT;
@@ -16065,6 +16066,7 @@ public StationStop CalculateStationStop(int platformStartID, int arrivalTime, in
1606516066
false,
1606616067
false,
1606716068
false,
16069+
false,
1606816070
StationStop.STOPTYPE.STATION_STOP);
1606916071

1607016072
thisStation.arrivalDT = arrivalDT;
@@ -20565,6 +20567,7 @@ public enum STOPTYPE
2056520567
public bool RestrictPlatformToSignal = false; // restrict end of platform to signal position
2056620568
public bool ExtendPlatformToSignal = false; // extend end of platform to next signal position
2056720569
public bool EndStop = false; // train terminates at station
20570+
public bool AllowDepartEarly = false; // train may depart early if boarding is completed
2056820571
public List<int> ConnectionsWaiting = new List<int>(); // List of trains waiting
2056920572
public Dictionary<int, int> ConnectionsAwaited = new Dictionary<int, int>(); // List of awaited trains : key = trainno., value = arr time
2057020573
public Dictionary<int, WaitInfo> ConnectionDetails = new Dictionary<int, WaitInfo>(); // Details of connection : key = trainno., value = wait info
@@ -20578,7 +20581,7 @@ public StationStop(int platformReference, PlatformDetails platformItem, int subr
2057820581
int tcSectionIndex, int direction, int exitSignal, bool holdSignal, bool noWaitSignal, bool noClaimAllowed, float stopOffset,
2057920582
int arrivalTime, int departTime, bool terminal, int? actualMinStopTime, float? keepClearFront, float? keepClearRear,
2058020583
bool forcePosition, bool closeupSignal, bool closeup,
20581-
bool restrictPlatformToSignal, bool extendPlatformToSignal, bool endStop, STOPTYPE actualStopType)
20584+
bool restrictPlatformToSignal, bool extendPlatformToSignal, bool endStop, bool allowdepartearly, STOPTYPE actualStopType)
2058220585
{
2058320586
ActualStopType = actualStopType;
2058420587
PlatformReference = platformReference;
@@ -20618,6 +20621,7 @@ public StationStop(int platformReference, PlatformDetails platformItem, int subr
2061820621
RestrictPlatformToSignal = restrictPlatformToSignal;
2061920622
ExtendPlatformToSignal = extendPlatformToSignal;
2062020623
EndStop = endStop;
20624+
AllowDepartEarly = allowdepartearly;
2062120625

2062220626
CallOnAllowed = false;
2062320627
}
@@ -20732,6 +20736,7 @@ public StationStop(BinaryReader inf, Signals signalRef)
2073220736
RestrictPlatformToSignal = inf.ReadBoolean();
2073320737
ExtendPlatformToSignal = inf.ReadBoolean();
2073420738
EndStop = inf.ReadBoolean();
20739+
AllowDepartEarly = inf.ReadBoolean();
2073520740
}
2073620741

2073720742
//================================================================================================//
@@ -20855,6 +20860,7 @@ public void Save(BinaryWriter outf)
2085520860
outf.Write(RestrictPlatformToSignal);
2085620861
outf.Write(ExtendPlatformToSignal);
2085720862
outf.Write(EndStop);
20863+
outf.Write(AllowDepartEarly);
2085820864
}
2085920865

2086020866
/// <summary>
@@ -20877,6 +20883,20 @@ public int CalculateDepartTime(int presentTime, Train stoppedTrain)
2087720883
int eightHundredHours = 8 * 3600;
2087820884
int sixteenHundredHours = 16 * 3600;
2087920885

20886+
int stopTime = 0;
20887+
20888+
// allow to depart early if set (timetable mode only, so no need to check for valid schedule)
20889+
if (AllowDepartEarly)
20890+
{
20891+
stoppedTrain.ComputeTrainBoardingTime(this, ref stopTime);
20892+
ActualDepart = ActualArrival + stopTime;
20893+
20894+
// correct for times around midnight
20895+
if (ActualDepart > 24 * 3600) ActualDepart -= 24 * 3600;
20896+
if (DepartTime == 0) DepartTime = ActualDepart;
20897+
return stopTime;
20898+
}
20899+
2088020900
// preset depart to booked time
2088120901
ActualDepart = DepartTime;
2088220902

@@ -20891,7 +20911,8 @@ public int CalculateDepartTime(int presentTime, Train stoppedTrain)
2089120911
}
2089220912

2089320913
// correct stop time for stop around midnight
20894-
int stopTime = DepartTime - ArrivalTime;
20914+
stopTime = DepartTime - ArrivalTime;
20915+
2089520916
if (DepartTime < eightHundredHours && ArrivalTime > sixteenHundredHours) // stop over midnight
2089620917
{
2089720918
stopTime += (24 * 3600);

Source/Orts.Simulation/Simulation/Timetables/ProcessTimetable.cs

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3185,6 +3185,7 @@ public enum SignalHoldType
31853185
public DateTime departureDT;
31863186
public DateTime passDT;
31873187
public bool arrdeppassvalid;
3188+
public bool allowDepartEarly;
31883189
public SignalHoldType holdState;
31893190
public bool noWaitSignal;
31903191
// public int passageTime; // not yet implemented
@@ -3207,6 +3208,7 @@ public StopInfo(string name, string arrTime, string depTime, TimetableInfo ttinf
32073208
departureTime = -1;
32083209
passTime = -1;
32093210
Commands = null;
3211+
allowDepartEarly = false;
32103212

32113213
TimeSpan atime;
32123214
bool validArrTime = false;
@@ -3224,22 +3226,32 @@ public StopInfo(string name, string arrTime, string depTime, TimetableInfo ttinf
32243226
passDT = new DateTime(atime.Ticks);
32253227
}
32263228
}
3229+
if (arrTime.Contains("*"))
3230+
{
3231+
allowDepartEarly = true;
3232+
string arrivTime = arrTime.Replace('*', ':');
3233+
validArrTime = TimeSpan.TryParse(arrivTime, out atime);
3234+
if (validArrTime)
3235+
{
3236+
departureTime = arrivalTime = Convert.ToInt32(atime.TotalSeconds);
3237+
departureDT = arrivalDT = new DateTime(atime.Ticks);
3238+
}
3239+
}
32273240
else
32283241
{
3229-
32303242
validArrTime = TimeSpan.TryParse(arrTime, out atime);
32313243
if (validArrTime)
32323244
{
32333245
arrivalTime = Convert.ToInt32(atime.TotalSeconds);
32343246
arrivalDT = new DateTime(atime.Ticks);
32353247
}
3236-
}
32373248

3238-
validDepTime = TimeSpan.TryParse(depTime, out atime);
3239-
if (validDepTime)
3240-
{
3241-
departureTime = Convert.ToInt32(atime.TotalSeconds);
3242-
departureDT = new DateTime(atime.Ticks);
3249+
validDepTime = TimeSpan.TryParse(depTime, out atime);
3250+
if (validDepTime)
3251+
{
3252+
departureTime = Convert.ToInt32(atime.TotalSeconds);
3253+
departureDT = new DateTime(atime.Ticks);
3254+
}
32433255
}
32443256

32453257
arrdeppassvalid = (validArrTime || validDepTime);
@@ -3418,7 +3430,8 @@ public bool BuildStopInfo(TTTrain actTrain, int actPlatformID, Signals signalRef
34183430

34193431
// create station stop info
34203432
validStop = actTrain.CreateStationStop(actPlatformID, arrivalTime, departureTime, arrivalDT, departureDT, AITrain.clearingDistanceM,
3421-
AITrain.minStopDistanceM, terminal, actMinStopTime,keepClearFront, keepClearRear, forcePosition, closeupSignal, closeup, restrictPlatformToSignal, extendPlatformToSignal, endStop);
3433+
AITrain.minStopDistanceM, terminal, actMinStopTime,keepClearFront, keepClearRear, forcePosition, closeupSignal, closeup, restrictPlatformToSignal,
3434+
extendPlatformToSignal, endStop, allowDepartEarly);
34223435

34233436
// override holdstate using stop info - but only if exit signal is defined
34243437

Source/Orts.Simulation/Simulation/Timetables/TTTrain.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1017,7 +1017,7 @@ public override StationStop SetAlternativeStationStop(StationStop orgStop, TCSub
10171017
StationStop newStop = CalculateStationStop(signalRef.PlatformDetailsList[altPlatformIndex].PlatformReference[0],
10181018
orgStop.ArrivalTime, orgStop.DepartTime, orgStop.arrivalDT, orgStop.departureDT, clearingDistanceM, minStopDistanceM,
10191019
orgStop.Terminal, orgStop.ActualMinStopTime, orgStop.KeepClearFront, orgStop.KeepClearRear, orgStop.ForcePosition,
1020-
orgStop.CloseupSignal, orgStop.Closeup, orgStop.RestrictPlatformToSignal, orgStop.ExtendPlatformToSignal, orgStop.EndStop);
1020+
orgStop.CloseupSignal, orgStop.Closeup, orgStop.RestrictPlatformToSignal, orgStop.ExtendPlatformToSignal, orgStop.EndStop, orgStop.AllowDepartEarly);
10211021

10221022
// add new holding signal if required
10231023
if (newStop.HoldSignal && newStop.ExitSignal >= 0)
@@ -1406,7 +1406,7 @@ public override bool PostInit()
14061406

14071407
public StationStop CalculateStationStop(int platformStartID, int arrivalTime, int departTime, DateTime arrivalDT, DateTime departureDT, float clearingDistanceM,
14081408
float minStopDistance, bool terminal, int? actMinStopTime, float? keepClearFront, float? keepClearRear, bool forcePosition, bool closeupSignal,
1409-
bool closeup, bool restrictPlatformToSignal, bool extendPlatformToSignal, bool endStop)
1409+
bool closeup, bool restrictPlatformToSignal, bool extendPlatformToSignal, bool endStop, bool allowdepartearly)
14101410
{
14111411
int platformIndex;
14121412
int activeSubroute = 0;
@@ -1491,6 +1491,7 @@ public StationStop CalculateStationStop(int platformStartID, int arrivalTime, in
14911491
restrictPlatformToSignal,
14921492
extendPlatformToSignal,
14931493
endStop,
1494+
allowdepartearly,
14941495
StationStop.STOPTYPE.STATION_STOP);
14951496

14961497
thisStation.arrivalDT = arrivalDT;
@@ -2105,11 +2106,11 @@ public StationStop CalculateStationStopPosition(TCSubpathRoute thisRoute, int ro
21052106
/// <returns></returns>
21062107
public bool CreateStationStop(int platformStartID, int arrivalTime, int departTime, DateTime arrivalDT, DateTime departureDT, float clearingDistanceM,
21072108
float minStopDistanceM, bool terminal, int? actMinStopTime, float? keepClearFront, float? keepClearRear, bool forcePosition, bool closeupSignal,
2108-
bool closeup, bool restrictPlatformToSignal, bool extendPlatformToSignal, bool endStop)
2109+
bool closeup, bool restrictPlatformToSignal, bool extendPlatformToSignal, bool endStop, bool allowdepartearly)
21092110
{
21102111
StationStop thisStation = CalculateStationStop(platformStartID, arrivalTime, departTime, arrivalDT, departureDT, clearingDistanceM,
21112112
minStopDistanceM, terminal, actMinStopTime, keepClearFront, keepClearRear, forcePosition, closeupSignal, closeup,
2112-
restrictPlatformToSignal, extendPlatformToSignal, endStop);
2113+
restrictPlatformToSignal, extendPlatformToSignal, endStop, allowdepartearly);
21132114

21142115
if (thisStation != null)
21152116
{

0 commit comments

Comments
 (0)