ATC Command Syntax

A train runs the current ATC command once it receives it, including delayed instructions. If the train receives a new command, the current command is discarded.
Spaces can be inserted into commands as needed and are ignored.

# simple commands:

S<[0-9]+ speed or 'M'>
Set target speed of train to <speed>. Accelerates if slower, rolls if faster. 'M' means maximum speed.
Execution of command continues immediately.

B<[0-9]+ speed>
Brake until speed is reached. If faster, apply brakes, if slower, do nothing.
Execution of command continues immediately.

Examples:
SM : accelerate to maximum speed
S0 : roll to stand
B0 : brake to stand
S0B3 or B3S0: brake to 3, then roll to stand.

W
Wait until S and/or B commands reached the desired speed before continuing execution.

D<[0-9]+ time>
Delay: Wait for time seconds before continuing execution.

R
Reverse: change movement direction of train. ONLY WORKS WHEN TRAIN STANDS, else no-op.
Use B0WR to definitely change direction.

Examples:
B0 W R D10 SM
Subway train stopping in dead end station and returning in opposite direction

OL
Open left doors
OR
Open right doors
OC
Close Doors
All door commands are relative to the arrow direction, so if a train drives to opposite arrow direction, L will open its right doors from driver perspective.
Execution continues immediately, there is no way to wait for all doors to be opened/closed.

Example:
B0 W OL D10 OC D1 SM
Subway train: stop in station and open doors, depart after 10 seconds.

# conditional statements:

I<condition><code>;
Execute code only if condition applies
I<condition><code1>E<code2>;
Execute code1 only if condition applies, else execute code2

Conditions:
+ / -
Tests the train's movement direction against the arrow on the ATC rail: M+ is true when train drives in direction of arrow.

[</>/<=/>=][speed]
Test if train's speed is greater or smaller than the given value

Examples:
I- B0 W R ; S8
If the train drives in the 'wrong' direction, stop and reverse; independently accelerate to speed 8 afterwards.

I<8 S8 ;
If the train is slower than 8, accelerate to 8.

# ATC controller operation modes
static: Only give 1 static command.

mesecon: Give 2 different commands depending on if the controller is mesecon-powered or not
digiline: Don't give any commands by itself. When a train passes, a digiline message in the form of "[+/-][speed]" is sent on the set channel (where +/- means the same as with conditions). Any digiline message sent to the controller will be interpreted as ATC command and sent to the train.
** the latter two are not yet implemented.

# Persistence
ATC controllers that are configured as 'static' or 'mesecon' are persistent over mapblock unloads and will even command the train when the mapblock is unloaded. This is not possible with digilines since these do not work in unloaded mapchunks.

# LUA ATC controller (in development)
The LUA ATC Controller will operate by using LUA code. All operations shown above will have a function equivalent. Additionally all LUA ATC controllers share an environment and setting signal and switch status will be possible to allow for complicated railway systems/fully automated subways a.s.o.
Also planned:
- digicompute add-on to allow computer access to the ATC environment (railway maps... ... ... ... ...)
