I think the correct way to frame this problem is in terms of blocks, not signal heads.
Cab signals indicate the current state of the block, which can change instantaneously. Signal heads indicate the status of the upcoming block, and regulate movements between blocks.
This is why cab signals do not show the "next" signal.
Code:
Stop Approach Approach Stop
(was Clear) Medium
o o o o
| [===][===][===] | | | [===][===][===]
----+-------------------+--------------------+--------------------+------------------->
Clear Approach Medium Approach Clear
|---------|
Restricting
This is why cab signals do not show the "next" signal.








Comment