OpenTTD Source  20240917-master-g9ab0a47812
signal.cpp File Reference
#include "stdafx.h"
#include "debug.h"
#include "station_map.h"
#include "tunnelbridge_map.h"
#include "vehicle_func.h"
#include "viewport_func.h"
#include "train.h"
#include "company_base.h"
#include "pbs.h"
#include "safeguards.h"

Go to the source code of this file.

Data Structures

struct  SmallSet< Tdir, items >
 Set containing 'items' items of 'tile and Tdir' No tree structure is used because it would cause slowdowns in most usual cases. More...
 
struct  SmallSet< Tdir, items >::SSdata
 Element of set. More...
 

Enumerations

enum  SigFlags {
  SF_NONE = 0, SF_TRAIN = 1 << 0, SF_EXIT = 1 << 1, SF_EXIT2 = 1 << 2,
  SF_GREEN = 1 << 3, SF_GREEN2 = 1 << 4, SF_FULL = 1 << 5, SF_PBS = 1 << 6,
  SF_SPLIT = 1 << 7, SF_ENTER = 1 << 8, SF_ENTER2 = 1 << 9
}
 Current signal block state flags. More...
 

Functions

static VehicleTrainOnTileEnum (Vehicle *v, void *)
 Check whether there is a train on rail, not in a depot.
 
static bool CheckAddToTodoSet (TileIndex t1, DiagDirection d1, TileIndex t2, DiagDirection d2)
 Perform some operations before adding data into Todo set The new and reverse direction is removed from _globset, because we are sure it doesn't need to be checked again Also, remove reverse direction from _tbdset This is the 'core' part so the graph searching won't enter any tile twice. More...
 
static bool MaybeAddToTodoSet (TileIndex t1, DiagDirection d1, TileIndex t2, DiagDirection d2)
 Perform some operations before adding data into Todo set The new and reverse direction is removed from Global set, because we are sure it doesn't need to be checked again Also, remove reverse direction from Todo set This is the 'core' part so the graph searching won't enter any tile twice. More...
 
static SigFlags ExploreSegment (Owner owner)
 Search signal block. More...
 
static void UpdateSignalsAroundSegment (SigFlags flags)
 Update signals around segment in _tbuset. More...
 
static void ResetSets ()
 Reset all sets after one set overflowed.
 
static SigSegState UpdateSignalsInBuffer (Owner owner)
 Updates blocks in _globset buffer. More...
 
void UpdateSignalsInBuffer ()
 Update signals in buffer Called from 'outside'.
 
void AddTrackToSignalBuffer (TileIndex tile, Track track, Owner owner)
 Add track to signal update buffer. More...
 
void AddSideToSignalBuffer (TileIndex tile, DiagDirection side, Owner owner)
 Add side of tile to signal update buffer. More...
 
SigSegState UpdateSignalsOnSegment (TileIndex tile, DiagDirection side, Owner owner)
 Update signals, starting at one side of a tile Will check tile next to this at opposite side too. More...
 
void SetSignalsOnBothDir (TileIndex tile, Track track, Owner owner)
 Update signals at segments that are at both ends of given (existent or non-existent) track. More...
 

Variables

static const uint SIG_TBU_SIZE = 64
 these are the maximums used for updating signal blocks More...
 
static const uint SIG_TBD_SIZE = 256
 number of intersections - open nodes in current block
 
static const uint SIG_GLOB_SIZE = 128
 number of open blocks (block can be opened more times until detected)
 
static const uint SIG_GLOB_UPDATE = 64
 how many items need to be in _globset to force update
 
static const TrackBits _enterdir_to_trackbits [DIAGDIR_END]
 incidating trackbits with given enterdir More...
 
static const TrackdirBits _enterdir_to_trackdirbits [DIAGDIR_END]
 incidating trackdirbits with given enterdir More...
 
static SmallSet< Trackdir, SIG_TBU_SIZE_tbuset ("_tbuset")
 set of signals that will be updated
 
static SmallSet< DiagDirection, SIG_TBD_SIZE_tbdset ("_tbdset")
 set of open nodes in current signal block
 
static SmallSet< DiagDirection, SIG_GLOB_SIZE_globset ("_globset")
 set of places to be updated in following runs
 
static Owner _last_owner = INVALID_OWNER
 last owner whose track was put into _globset
 

Detailed Description

functions related to rail signals updating

Definition in file signal.cpp.

Enumeration Type Documentation

◆ SigFlags

enum SigFlags

Current signal block state flags.

Enumerator
SF_TRAIN 

train found in segment

SF_EXIT 

exitsignal found

SF_EXIT2 

two or more exits found

SF_GREEN 

green exitsignal found

SF_GREEN2 

two or more green exits found

SF_FULL 

some of buffers was full, do not continue

SF_PBS 

pbs signal found

SF_SPLIT 

track merge/split found

SF_ENTER 

signal entering the block found

SF_ENTER2 

two or more signals entering the block found

Definition at line 246 of file signal.cpp.

Function Documentation

◆ AddSideToSignalBuffer()

void AddSideToSignalBuffer ( TileIndex  tile,
DiagDirection  side,
Owner  owner 
)

Add side of tile to signal update buffer.

Parameters
tiletile where we start
sideside of tile
ownerowner whose signals we will update

Definition at line 624 of file signal.cpp.

References _globset, _last_owner, INVALID_OWNER, SIG_GLOB_UPDATE, and UpdateSignalsInBuffer().

◆ AddTrackToSignalBuffer()

void AddTrackToSignalBuffer ( TileIndex  tile,
Track  track,
Owner  owner 
)

Add track to signal update buffer.

Parameters
tiletile where we start
tracktrack at which ends we will update signals
ownerowner whose signals we will update

Definition at line 592 of file signal.cpp.

References _globset, _last_owner, DIAGDIR_NE, DIAGDIR_NW, DIAGDIR_SE, DIAGDIR_SW, INVALID_OWNER, SIG_GLOB_UPDATE, and UpdateSignalsInBuffer().

Referenced by SetSignalsOnBothDir().

◆ CheckAddToTodoSet()

static bool CheckAddToTodoSet ( TileIndex  t1,
DiagDirection  d1,
TileIndex  t2,
DiagDirection  d2 
)
inlinestatic

Perform some operations before adding data into Todo set The new and reverse direction is removed from _globset, because we are sure it doesn't need to be checked again Also, remove reverse direction from _tbdset This is the 'core' part so the graph searching won't enter any tile twice.

Parameters
t1tile we are entering
d1direction (tile side) we are entering
t2tile we are leaving
d2direction (tile side) we are leaving
Returns
false iff reverse direction was in Todo set

Definition at line 213 of file signal.cpp.

References _globset, and _tbdset.

Referenced by MaybeAddToTodoSet().

◆ ExploreSegment()

static SigFlags ExploreSegment ( Owner  owner)
static

Search signal block.

Parameters
ownerowner whose signals we are updating
Returns
SigFlags

Definition at line 269 of file signal.cpp.

Referenced by UpdateSignalsInBuffer().

◆ MaybeAddToTodoSet()

static bool MaybeAddToTodoSet ( TileIndex  t1,
DiagDirection  d1,
TileIndex  t2,
DiagDirection  d2 
)
inlinestatic

Perform some operations before adding data into Todo set The new and reverse direction is removed from Global set, because we are sure it doesn't need to be checked again Also, remove reverse direction from Todo set This is the 'core' part so the graph searching won't enter any tile twice.

Parameters
t1tile we are entering
d1direction (tile side) we are entering
t2tile we are leaving
d2direction (tile side) we are leaving
Returns
false iff the Todo buffer would be overrun

Definition at line 237 of file signal.cpp.

References _tbdset, and CheckAddToTodoSet().

◆ SetSignalsOnBothDir()

void SetSignalsOnBothDir ( TileIndex  tile,
Track  track,
Owner  owner 
)

Update signals at segments that are at both ends of given (existent or non-existent) track.

See also
UpdateSignalsInBuffer()
Parameters
tiletile where we start
tracktrack at which ends we will update signals
ownerowner whose signals we will update

Definition at line 668 of file signal.cpp.

References _globset, AddTrackToSignalBuffer(), and UpdateSignalsInBuffer().

◆ UpdateSignalsAroundSegment()

static void UpdateSignalsAroundSegment ( SigFlags  flags)
static

Update signals around segment in _tbuset.

Parameters
flagsinfo about segment

Definition at line 413 of file signal.cpp.

References _tbuset, HasSignalOnTrackdir(), INVALID_TILE, INVALID_TRACKDIR, and TrackdirToTrack().

Referenced by UpdateSignalsInBuffer().

◆ UpdateSignalsInBuffer()

◆ UpdateSignalsOnSegment()

SigSegState UpdateSignalsOnSegment ( TileIndex  tile,
DiagDirection  side,
Owner  owner 
)

Update signals, starting at one side of a tile Will check tile next to this at opposite side too.

See also
UpdateSignalsInBuffer()
Parameters
tiletile where we start
sideside of tile
ownerowner whose signals we will update
Returns
the state of the signal segment

Definition at line 650 of file signal.cpp.

References _globset, and UpdateSignalsInBuffer().

Referenced by CheckTrainStayInDepot(), and VehicleEnterDepot().

Variable Documentation

◆ _enterdir_to_trackbits

const TrackBits _enterdir_to_trackbits[DIAGDIR_END]
static
Initial value:

incidating trackbits with given enterdir

Definition at line 32 of file signal.cpp.

Referenced by UpdateSignalsInBuffer().

◆ _enterdir_to_trackdirbits

◆ SIG_TBU_SIZE

const uint SIG_TBU_SIZE = 64
static

these are the maximums used for updating signal blocks

number of signals entering to block

Definition at line 24 of file signal.cpp.

TRACKDIR_BIT_LEFT_N
@ TRACKDIR_BIT_LEFT_N
Track left, direction north.
Definition: track_type.h:111
TRACK_BIT_3WAY_SW
@ TRACK_BIT_3WAY_SW
"Arrow" to the south-west
Definition: track_type.h:48
TRACKDIR_BIT_Y_NW
@ TRACKDIR_BIT_Y_NW
Track y-axis, direction north-west.
Definition: track_type.h:108
TRACK_BIT_3WAY_NE
@ TRACK_BIT_3WAY_NE
"Arrow" to the north-east
Definition: track_type.h:46
TRACKDIR_BIT_LOWER_W
@ TRACKDIR_BIT_LOWER_W
Track lower, direction west.
Definition: track_type.h:110
TRACKDIR_BIT_UPPER_E
@ TRACKDIR_BIT_UPPER_E
Track upper, direction east.
Definition: track_type.h:102
TRACKDIR_BIT_LEFT_S
@ TRACKDIR_BIT_LEFT_S
Track left, direction south.
Definition: track_type.h:104
TRACKDIR_BIT_RIGHT_S
@ TRACKDIR_BIT_RIGHT_S
Track right, direction south.
Definition: track_type.h:105
TRACKDIR_BIT_X_NE
@ TRACKDIR_BIT_X_NE
Track x-axis, direction north-east.
Definition: track_type.h:100
TRACKDIR_BIT_LOWER_E
@ TRACKDIR_BIT_LOWER_E
Track lower, direction east.
Definition: track_type.h:103
TRACKDIR_BIT_Y_SE
@ TRACKDIR_BIT_Y_SE
Track y-axis, direction south-east.
Definition: track_type.h:101
TRACKDIR_BIT_RIGHT_N
@ TRACKDIR_BIT_RIGHT_N
Track right, direction north.
Definition: track_type.h:112
TRACK_BIT_3WAY_NW
@ TRACK_BIT_3WAY_NW
"Arrow" to the north-west
Definition: track_type.h:49
TRACK_BIT_3WAY_SE
@ TRACK_BIT_3WAY_SE
"Arrow" to the south-east
Definition: track_type.h:47
TRACKDIR_BIT_UPPER_W
@ TRACKDIR_BIT_UPPER_W
Track upper, direction west.
Definition: track_type.h:109
TRACKDIR_BIT_X_SW
@ TRACKDIR_BIT_X_SW
Track x-axis, direction south-west.
Definition: track_type.h:107