Trace restrict slots: Add support for slot operations at PBS end signal

This commit is contained in:
Jonathan G Rennison
2018-06-17 21:13:53 +01:00
parent 1b4db7d86c
commit e9f5d80440
8 changed files with 110 additions and 6 deletions

View File

@@ -515,7 +515,7 @@ bool IsSafeWaitingPosition(const Train *v, TileIndex tile, Trackdir trackdir, bo
* @param forbid_90deg Don't allow trains to make 90 degree turns
* @return True if the position is free
*/
bool IsWaitingPositionFree(const Train *v, TileIndex tile, Trackdir trackdir, bool forbid_90deg)
bool IsWaitingPositionFree(const Train *v, TileIndex tile, Trackdir trackdir, bool forbid_90deg, PBSWaitingPositionRestrictedSignalInfo *restricted_signal_info)
{
Track track = TrackdirToTrack(trackdir);
TrackBits reserved = GetReservedTrackbits(tile);
@@ -526,12 +526,18 @@ bool IsWaitingPositionFree(const Train *v, TileIndex tile, Trackdir trackdir, bo
/* Not reserved and depot or not a pbs signal -> free. */
if (IsRailDepotTile(tile)) return true;
auto pbs_res_end_wait_test = [v](TileIndex t, Trackdir td) -> bool {
auto pbs_res_end_wait_test = [v, restricted_signal_info](TileIndex t, Trackdir td) -> bool {
if (IsRestrictedSignal(t)) {
const TraceRestrictProgram *prog = GetExistingTraceRestrictProgram(t, TrackdirToTrack(td));
if (restricted_signal_info && prog) {
restricted_signal_info->tile = t;
restricted_signal_info->trackdir = td;
}
if (prog && prog->actions_used_flags & TRPAUF_PBS_RES_END_WAIT) {
TraceRestrictProgramInput input(t, td, &VehiclePosTraceRestrictPreviousSignalCallback, NULL);
input.permitted_slot_operations = TRPISP_PBS_RES_END_ACQ_DRY;
TraceRestrictProgramResult out;
prog->Execute(v, TraceRestrictProgramInput(t, td, &VehiclePosTraceRestrictPreviousSignalCallback, NULL), out);
prog->Execute(v, input, out);
if (out.flags & TRPRF_PBS_RES_END_WAIT) {
return false;
}