aboutsummaryrefslogtreecommitdiff
path: root/advtrains_interlocking/database.lua
diff options
context:
space:
mode:
authororwell <orwell@bleipb.de>2024-11-25 22:31:26 +0100
committerorwell <orwell@bleipb.de>2024-11-25 22:31:26 +0100
commit922e654b7bef51c7ddaf510ec70880d48181dd35 (patch)
tree3d12820d7a67180df3d2bd36d3fa7b4d61c1166c /advtrains_interlocking/database.lua
parent73c393e223b1d2d81b767d8036c7fdec7ca20100 (diff)
downloadadvtrains-922e654b7bef51c7ddaf510ec70880d48181dd35.tar.gz
advtrains-922e654b7bef51c7ddaf510ec70880d48181dd35.tar.bz2
advtrains-922e654b7bef51c7ddaf510ec70880d48181dd35.zip
Make Buffers become implicitly their own TCBs and signals when interlocking is enabled
Diffstat (limited to 'advtrains_interlocking/database.lua')
-rw-r--r--advtrains_interlocking/database.lua41
1 files changed, 37 insertions, 4 deletions
diff --git a/advtrains_interlocking/database.lua b/advtrains_interlocking/database.lua
index e77d073..75247de 100644
--- a/advtrains_interlocking/database.lua
+++ b/advtrains_interlocking/database.lua
@@ -802,10 +802,18 @@ function ildb.create_tcb_at(pos)
end
-- Remove TCB at the position and update/repair the now joined section
-function ildb.remove_tcb_at(pos)
+-- skip_tsrepair: should be set to true when the rail node at the TCB position is already gone.
+-- Assumes the track sections are now separated and does not attempt the repair process.
+function ildb.remove_tcb_at(pos, pname, skip_tsrepair)
--atdebug("remove_tcb_at",pos)
local pts = advtrains.encode_pos(pos)
local old_tcb = track_circuit_breaks[pts]
+ -- unassign signals if defined
+ for connid=1,2 do
+ if old_tcb[connid].signal then
+ ildb.set_sigd_for_signal(old_tcb[connid].signal, nil)
+ end
+ end
track_circuit_breaks[pts] = nil
-- purge the track sections adjacent
if old_tcb[1].ts_id then
@@ -823,7 +831,9 @@ function ildb.remove_tcb_at(pos)
end
advtrains.interlocking.remove_tcb_marker(pos)
-- If needed, merge the track sections here
- ildb.check_and_repair_ts_at_pos(pos, nil)
+ if not skip_tsrepair then
+ ildb.check_and_repair_ts_at_pos(pos, pname)
+ end
return true
end
@@ -973,11 +983,34 @@ function ildb.get_sigd_for_signal(pos)
end
return nil
end
-function ildb.set_sigd_for_signal(pos, sigd)
+function ildb.set_sigd_for_signal(pos, sigd) -- do not use!
local pts = advtrains.roundfloorpts(pos)
signal_assignments[pts] = sigd
end
+-- Assign the signal at pos to the given TCB side.
+function ildb.assign_signal_to_tcbs(pos, sigd)
+ local tcbs = ildb.get_tcbs(sigd)
+ assert(tcbs, "assign_signal_to_tcbs invalid sigd!")
+ tcbs.signal = pos
+ if not tcbs.routes then
+ tcbs.routes = {}
+ end
+ ildb.set_sigd_for_signal(pos, sigd)
+end
+
+-- unassign the signal from the given sigd (looks in tcbs.signal for the signalpos)
+function ildb.unassign_signal_for_tcbs(sigd)
+ local tcbs = advtrains.interlocking.db.get_tcbs(sigd)
+ if not tcbs then return end
+ local pos = tcbs.signal
+ if not pos then return end
+ ildb.set_sigd_for_signal(pos, nil)
+ tcbs.signal = nil
+ tcbs.route_aspect = nil
+ tcbs.route_remote = nil
+end
+
-- checks if there's any influence point set to this position
-- if purge is true, checks whether the associated signal still exists
-- and deletes the ip if not.
@@ -987,7 +1020,7 @@ function ildb.is_ip_at(pos, purge)
if purge then
-- is there still a signal assigned to it?
for connid, sigpos in pairs(influence_points[pts]) do
- local asp = advtrains.interlocking.signal_get_aspect(sigpos)
+ local asp = advtrains.interlocking.signal.get_aspect(sigpos)
if not asp then
atlog("Clearing orphaned signal influence point", pts, "/", connid)
ildb.clear_ip_signal(pts, connid)