Interlocking: Create demo signals, signal API and model for TCB configurer node

This commit is contained in:
orwell96 2018-06-19 19:50:11 +02:00
parent 08ac0f9c05
commit 65675664e3
13 changed files with 437 additions and 4 deletions

View File

@ -5,8 +5,7 @@ The interlocking system is based on track circuits.
Track circuit breaks must be manually set by the user. Signals must be assigned to track circuit breaks and to a direction(connid).
To simplify the whole system, there is no overlap.
== Trains ==
A train always reserves the space between two signals facing it. All track circuits in this space
have a reservation entry TRAIN with the train's ID
Trains always occupy certain track circuits. These are shown red in the signalbox view (TRAIN occupation entry).
== Database storage ==
The things that are actually saved are the Track Circuit Breaks. Each TCB holds a list of the TCBs that are adjacent in each direction.
TC occupation/state is then saved inside each (TCB,Direction) and held in sync across all TCBs adjacent to this one. If something should not be in sync,
@ -21,6 +20,8 @@ A track circuit does not have a state as such, but has more or less a list of "r
type can be one of these:
TRAIN See Trains obove
ROUTE Route set from a signal, but no train has yet passed that signal.
Not implemented (see note by reversible): OWNED - former ROUTE segments that a train has begun passing (train_id assigned)
- Space behind a train up to the next signal, when a TC is set as REVERSIBLE
Certain TCs can be marked as "allow call-on".
== Route setting: ==
Routes are set from a signal (the entry signal) to another signal facing the same direction (the exit signal)
@ -35,8 +36,17 @@ Apart from this, we need to set turnouts
It will be necessary to join and split trains using call-on routes. A call-on route may be set when:
- there are no ROUTE reservations
- there are TRAIN reservations only inside TCs that have "allow call-on" set
== TC Properties ==
Note: Reversible property will not be implemented, assuming everything as non-rev.
This is sufficient to cover all use cases, and is done this way in reality.
REVERSIBLE - Whether trains are allowed to reverse while on track circuit
This property is supposed to be set for station tracks, where there is a signal at each end, and for sidings.
It should in no case be set for TCs covering turnouts, or for main running lines.
When a TC is not set as reversible, the OWNED status is cleared from the TC right after the train left it,
to allow other trains to pass it.
If it is set reversible, interlocking will keep the OWNED state behind the train up to the next signal, clearing it
as soon as the train passes another signal or enters a non-reversible section.
CALL_ON_ALLOWED - Whether this TC being blocked (TRAIN or ROUTE) does not prevent shunt routes being set through this TC
== More notes ==
- It may not be possible to switch turnouts when their TC has any state entry

View File

@ -0,0 +1,89 @@
-- Demonstration signals
-- Those can display the 3 main aspects of Ks signals
minetest.register_node("advtrains_interlocking:ds_danger", {
description = "Demo signal at Danger",
tiles = {"at_il_signal_asp_danger.png"},
groups = {
cracky = 3,
advtrains_signal = 1,
save_in_at_nodedb = 1,
},
sounds = default.node_sound_stone_defaults(),
advtrains = {
set_aspect = function(pos, node, asp)
if asp.main.free then
if asp.dst.free and asp.main.speed > 50 then
advtrains.ndb.swap_node(pos, {name="advtrains_interlocking:ds_free"})
else
advtrains.ndb.swap_node(pos, {name="advtrains_interlocking:ds_slow"})
end
else
advtrains.ndb.swap_node(pos, {name="advtrains_interlocking:ds_danger"})
end
local meta = minetest.get_meta(pos)
if meta then
meta:set_string("infotext", minetest.serialize(asp))
end
end
},
on_rightclick = advtrains.interlocking.signal_rc_handler
})
minetest.register_node("advtrains_interlocking:ds_free", {
description = "Demo signal at Free",
tiles = {"at_il_signal_asp_free.png"},
groups = {
cracky = 3,
advtrains_signal = 1,
save_in_at_nodedb = 1,
},
sounds = default.node_sound_stone_defaults(),
advtrains = {
set_aspect = function(pos, node, asp)
if asp.main.free then
if asp.dst.free and asp.main.speed > 50 then
advtrains.ndb.swap_node(pos, {name="advtrains_interlocking:ds_free"})
else
advtrains.ndb.swap_node(pos, {name="advtrains_interlocking:ds_slow"})
end
else
advtrains.ndb.swap_node(pos, {name="advtrains_interlocking:ds_danger"})
end
local meta = minetest.get_meta(pos)
if meta then
meta:set_string("infotext", minetest.serialize(asp))
end
end
},
on_rightclick = advtrains.interlocking.signal_rc_handler
})
minetest.register_node("advtrains_interlocking:ds_slow", {
description = "Demo signal at Slow",
tiles = {"at_il_signal_asp_slow.png"},
groups = {
cracky = 3,
advtrains_signal = 1,
save_in_at_nodedb = 1,
},
sounds = default.node_sound_stone_defaults(),
advtrains = {
set_aspect = function(pos, node, asp)
if asp.main.free then
if asp.dst.free and asp.main.speed > 50 then
advtrains.ndb.swap_node(pos, {name="advtrains_interlocking:ds_free"})
else
advtrains.ndb.swap_node(pos, {name="advtrains_interlocking:ds_slow"})
end
else
advtrains.ndb.swap_node(pos, {name="advtrains_interlocking:ds_danger"})
end
local meta = minetest.get_meta(pos)
if meta then
meta:set_string("infotext", minetest.serialize(asp))
end
end
},
on_rightclick = advtrains.interlocking.signal_rc_handler
})

View File

@ -0,0 +1 @@
advtrains

View File

@ -0,0 +1,10 @@
-- Advtrains interlocking system
-- See database.lua for a detailed explanation
advtrains.interlocking = {}
local modpath = minetest.get_modpath(minetest.get_current_modname()) .. DIR_DELIM
dofile(modpath.."database.lua")
dofile(modpath.."signal_api.lua")
dofile(modpath.."demosignals.lua")

View File

@ -0,0 +1,248 @@
# Blender v2.76 (sub 0) OBJ File: ''
# www.blender.org
mtllib at_il_tcb_node.mtl
o Cube
v 0.038370 -0.500000 -0.038370
v 0.038370 -0.500000 0.038370
v -0.038370 -0.500000 0.038370
v -0.038370 -0.500000 -0.038370
v 0.038370 0.098086 -0.038370
v 0.038370 0.098086 0.038370
v -0.038370 0.098086 0.038370
v -0.038370 0.098086 -0.038370
v -0.182395 0.065479 0.099357
v -0.182395 0.182395 0.099357
v -0.182395 0.065479 -0.171034
v -0.182395 0.182395 -0.171034
v 0.182395 0.065479 0.099357
v 0.182395 0.182395 0.099357
v 0.182395 0.065479 -0.171034
v 0.182395 0.182395 -0.171034
v -0.112374 0.070035 -0.139406
v -0.112374 -0.500000 -0.139406
v 0.112189 -0.500000 -0.139406
v 0.112189 0.070035 -0.139406
v 0.122883 -0.500000 -0.137278
v 0.122883 0.070035 -0.137278
v 0.131950 -0.500000 -0.131220
v 0.131950 0.070035 -0.131220
v 0.138008 -0.500000 -0.122154
v 0.138008 0.070035 -0.122154
v 0.140135 -0.500000 -0.111459
v 0.140135 0.070035 -0.111459
v 0.138008 -0.500000 -0.100765
v 0.138008 0.070035 -0.100765
v 0.131950 -0.500000 -0.091698
v 0.131950 0.070035 -0.091698
v 0.122883 -0.500000 -0.085640
v 0.122883 0.070035 -0.085640
v 0.112189 -0.500000 -0.083513
v 0.112189 0.070035 -0.083513
v 0.101494 -0.500000 -0.085640
v 0.101494 0.070035 -0.085640
v 0.092428 -0.500000 -0.091698
v 0.092428 0.070035 -0.091698
v 0.086370 -0.500000 -0.100765
v 0.086370 0.070035 -0.100765
v 0.084242 -0.500000 -0.111459
v 0.084242 0.070035 -0.111459
v 0.086370 -0.500000 -0.122154
v 0.086370 0.070035 -0.122154
v 0.092428 -0.500000 -0.131220
v 0.092428 0.070035 -0.131220
v 0.101494 -0.500000 -0.137278
v 0.101494 0.070035 -0.137278
v -0.101679 -0.500000 -0.137278
v -0.101679 0.070035 -0.137278
v -0.092613 -0.500000 -0.131220
v -0.092613 0.070035 -0.131220
v -0.086555 -0.500000 -0.122154
v -0.086555 0.070035 -0.122154
v -0.084428 -0.500000 -0.111459
v -0.084428 0.070035 -0.111459
v -0.086555 -0.500000 -0.100765
v -0.086555 0.070035 -0.100765
v -0.092613 -0.500000 -0.091698
v -0.092613 0.070035 -0.091698
v -0.101679 -0.500000 -0.085640
v -0.101679 0.070035 -0.085640
v -0.112374 -0.500000 -0.083513
v -0.112374 0.070035 -0.083513
v -0.123069 -0.500000 -0.085640
v -0.123069 0.070035 -0.085640
v -0.132135 -0.500000 -0.091698
v -0.132135 0.070035 -0.091698
v -0.138193 -0.500000 -0.100765
v -0.138193 0.070035 -0.100765
v -0.140320 -0.500000 -0.111459
v -0.140320 0.070035 -0.111459
v -0.138193 -0.500000 -0.122154
v -0.138193 0.070035 -0.122154
v -0.132135 -0.500000 -0.131220
v -0.132135 0.070035 -0.131220
v -0.123069 -0.500000 -0.137278
v -0.123069 0.070035 -0.137278
vt 0.876073 0.266665
vt 0.876073 0.977812
vt 0.784827 0.977812
vt 0.784827 0.266665
vt 0.693582 0.977812
vt 0.693582 0.266665
vt 0.602336 0.977812
vt 0.602336 0.266665
vt 0.967319 0.266665
vt 0.967319 0.977812
vt 0.147929 0.032040
vt 0.469434 0.032040
vt 0.469434 0.171057
vt 0.147929 0.171057
vt 0.903184 0.032040
vt 0.903184 0.171057
vt 0.147929 0.032751
vt 0.469434 0.032751
vt 0.469434 0.171768
vt 0.147929 0.171768
vt 0.903184 0.032751
vt 0.903183 0.171768
vt 0.263807 0.270252
vt 0.585312 0.270252
vt 0.585312 0.704001
vt 0.263807 0.704001
vt 0.584297 0.703059
vt 0.262792 0.703059
vt 0.262793 0.269309
vt 0.584297 0.269309
vt 0.108472 0.980897
vt 0.108473 0.303114
vt 0.121438 0.303114
vt 0.121438 0.980897
vt 0.081877 0.980125
vt 0.081879 0.302342
vt 0.094844 0.302342
vt 0.094843 0.980125
vt 0.095507 0.980897
vt 0.095508 0.303114
vt 0.107809 0.302342
vt 0.107808 0.980125
vt 0.082541 0.980897
vt 0.082543 0.303114
vt 0.120774 0.302342
vt 0.120774 0.980125
vt 0.069575 0.980897
vt 0.069577 0.303114
vt 0.133739 0.302342
vt 0.133740 0.980125
vt 0.056609 0.980897
vt 0.056612 0.303114
vt 0.146705 0.302342
vt 0.146706 0.980125
vt 0.043643 0.980897
vt 0.043647 0.303114
vt 0.159670 0.302342
vt 0.159672 0.980125
vt 0.030677 0.980897
vt 0.030682 0.303113
vt 0.172635 0.302342
vt 0.172638 0.980125
vt 0.017711 0.980897
vt 0.017717 0.303113
vt 0.185600 0.302342
vt 0.185604 0.980125
vt 0.212200 0.980896
vt 0.212195 0.303113
vt 0.225160 0.303113
vt 0.225166 0.980896
vt 0.198565 0.302342
vt 0.198570 0.980125
vt 0.199234 0.980897
vt 0.199230 0.303114
vt 0.211531 0.302342
vt 0.211536 0.980125
vt 0.186268 0.980897
vt 0.186264 0.303114
vt 0.224496 0.302342
vt 0.224502 0.980125
vt 0.173302 0.980897
vt 0.173299 0.303114
vt 0.017047 0.980125
vt 0.017052 0.302342
vt 0.030018 0.302342
vt 0.030013 0.980125
vt 0.134403 0.303114
vt 0.134404 0.980897
vt 0.160336 0.980897
vt 0.160334 0.303114
vt 0.042983 0.302342
vt 0.042979 0.980125
vt 0.147369 0.303114
vt 0.147370 0.980897
vt 0.055948 0.302342
vt 0.055945 0.980125
vt 0.068911 0.980125
vt 0.068913 0.302342
vn 1.000000 0.000000 0.000000
vn -0.000000 -0.000000 1.000000
vn -1.000000 -0.000000 -0.000000
vn 0.000000 0.000000 -1.000000
vn 0.000000 -1.000000 0.000000
vn 0.000000 1.000000 0.000000
vn -0.831500 0.000000 -0.555600
vn 0.195100 0.000000 -0.980800
vn -0.980800 0.000000 -0.195100
vn 0.555600 0.000000 -0.831500
vn -0.980800 0.000000 0.195100
vn 0.831500 0.000000 -0.555600
vn -0.831500 0.000000 0.555600
vn 0.980800 0.000000 -0.195100
vn -0.555600 0.000000 0.831500
vn 0.980800 0.000000 0.195100
vn -0.195100 0.000000 0.980800
vn 0.831500 0.000000 0.555600
vn 0.195100 0.000000 0.980800
vn 0.555600 0.000000 0.831500
vn -0.555600 0.000000 -0.831500
vn -0.195100 0.000000 -0.980800
usemtl Material
s off
f 1/1/1 5/2/1 6/3/1 2/4/1
f 2/4/2 6/3/2 7/5/2 3/6/2
f 3/6/3 7/5/3 8/7/3 4/8/3
f 5/2/4 1/1/4 4/9/4 8/10/4
f 10/11/3 12/12/3 11/13/3 9/14/3
f 12/12/4 16/15/4 15/16/4 11/13/4
f 16/17/1 14/18/1 13/19/1 15/20/1
f 14/18/2 10/21/2 9/22/2 13/19/2
f 9/23/5 11/24/5 15/25/5 13/26/5
f 14/27/6 16/28/6 12/29/6 10/30/6
f 75/31/7 76/32/7 78/33/7 77/34/7
f 19/35/8 20/36/8 22/37/8 21/38/8
f 73/39/9 74/40/9 76/32/9 75/31/9
f 21/38/10 22/37/10 24/41/10 23/42/10
f 71/43/11 72/44/11 74/40/11 73/39/11
f 23/42/12 24/41/12 26/45/12 25/46/12
f 69/47/13 70/48/13 72/44/13 71/43/13
f 25/46/14 26/45/14 28/49/14 27/50/14
f 67/51/15 68/52/15 70/48/15 69/47/15
f 27/50/16 28/49/16 30/53/16 29/54/16
f 65/55/17 66/56/17 68/52/17 67/51/17
f 29/54/18 30/53/18 32/57/18 31/58/18
f 63/59/19 64/60/19 66/56/19 65/55/19
f 31/58/20 32/57/20 34/61/20 33/62/20
f 61/63/20 62/64/20 64/60/20 63/59/20
f 33/62/19 34/61/19 36/65/19 35/66/19
f 59/67/18 60/68/18 62/69/18 61/70/18
f 35/66/17 36/65/17 38/71/17 37/72/17
f 57/73/16 58/74/16 60/68/16 59/67/16
f 37/72/15 38/71/15 40/75/15 39/76/15
f 55/77/14 56/78/14 58/74/14 57/73/14
f 39/76/13 40/75/13 42/79/13 41/80/13
f 53/81/12 54/82/12 56/78/12 55/77/12
f 41/83/11 42/84/11 44/85/11 43/86/11
f 77/34/21 78/33/21 80/87/21 79/88/21
f 51/89/10 52/90/10 54/82/10 53/81/10
f 43/86/9 44/85/9 46/91/9 45/92/9
f 79/88/22 80/87/22 17/93/22 18/94/22
f 18/94/8 17/93/8 52/90/8 51/89/8
f 45/92/7 46/91/7 48/95/7 47/96/7
f 49/97/22 50/98/22 20/36/22 19/35/22
f 47/96/21 48/95/21 50/98/21 49/97/21

View File

@ -0,0 +1,75 @@
-- Signal API implementation
--[[ Signal aspect table:
asp = {
main = {
free = <boolean>,
speed = <int km/h>,
},
shunt = {
free = <boolean>,
}
dst = {
free = <boolean>,
speed = <int km/h>,
}
info = {
call_on = <boolean>, -- Call-on route, expect train in track ahead
dead_end = <boolean>, -- Route ends on a dead end (e.g. bumper)
}
}
Signals API:
groups = {
advtrains_signal = 1,
save_in_at_nodedb = 1,
}
advtrains = {
function set_aspect(pos, node, asp)
...
end
}
on_rightclick = advtrains.interlocking.signal_rc_handler
]]--
function advtrains.interlocking.signal_set_aspect(pos, asp)
local node=advtrains.ndb.get_node(pos)
local ndef=minetest.registered_nodes[node.name]
if ndef and ndef.advtrains and ndef.advtrains.set_aspect then
ndef.advtrains.set_aspect(pos, node, asp)
end
end
function advtrains.interlocking.signal_rc_handler(pos, node, player, itemstack, pointed_thing)
local pname = player:get_player_name()
minetest.show_formspec(pname, "at_il_sigasp_"..minetest.pos_to_string(pos), "field[aspect;Set Aspect (F/D)Speed(F/D)Speed(F/D);D0D0D]")
end
minetest.register_on_player_receive_fields(function(player, formname, fields)
local pname = player:get_player_name()
local pts = string.match(formname, "^at_il_sigasp_(.+)$")
local pos
if pts then pos = minetest.string_to_pos(pts) end
if pos and fields.aspect then
local mfs, msps, dfs, dsps, shs = string.match(fields.aspect, "^([FD])([0-9]+)([FD])([0-9]+)([FD])$")
local asp = {
main = {
free = mfs=="F",
speed = tonumber(msps),
},
shunt = {
free = shs=="F",
},
dst = {
free = dfs=="F",
speed = tonumber(dsps),
},
info = {
call_on = false, -- Call-on route, expect train in track ahead
dead_end = false, -- Route ends on a dead end (e.g. bumper)
}
}
advtrains.interlocking.signal_set_aspect(pos, asp)
end
end)

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 245 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 245 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 308 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 B

BIN
assets/at_il_tcb_node.blend Normal file

Binary file not shown.