93 lines
2.7 KiB
Lua
93 lines
2.7 KiB
Lua
require("Serializer")
|
|
|
|
Zuglenkung_Slot = Zuglenkung_Slot or 991
|
|
Zuglenkung_Auftreage = ladeTabelle(Zuglenkung_Slot)
|
|
|
|
-- Extrafunktion, damit der User das ueberschreiben kann
|
|
function ZuglenkungMelden(...)
|
|
local Zeitstempel = string.format("%02d:%02d:%02d", EEPTimeH, EEPTimeM, EEPTimeS)
|
|
print(Zeitstempel," Zuglenkung: ",...)
|
|
end
|
|
|
|
function Zuglenkung(...)
|
|
local Weg = {...}
|
|
if #Weg % 2 == 1 then
|
|
print("Zuglenkung() erfordert eine gerade Anzahl Argumente")
|
|
return
|
|
end
|
|
local Auftrag=nil
|
|
for i=#Weg-1,1,-2 do
|
|
Auftrag={Weg[i],Weg[i+1],0,Auftrag}
|
|
end
|
|
ZuglenkungAuftrag(Auftrag)
|
|
speicherTabelle(Zuglenkung_Slot, Zuglenkung_Auftreage)
|
|
end
|
|
|
|
function ZuglenkungAuftrag(Auftrag)
|
|
if Zuglenkung_Auftreage[Auftrag[1]] ~= nil then
|
|
ZuglenkungMelden("Stellauftrag ", Auftrag[1], " verworfen")
|
|
end
|
|
Zuglenkung_Auftreage[Auftrag[1]]=Auftrag
|
|
if type(Auftrag[2]) == "number" then
|
|
ZuglenkungMelden("Anmeldung ",string.format("FS %04d-%02d",Auftrag[1],Auftrag[2]))
|
|
else
|
|
ZuglenkungMelden("Anmeldung ",string.format("FS %04d",Auftrag[1])," zu ",__tostring(Auftrag[2]))
|
|
end
|
|
end
|
|
|
|
function ZuglenkungMain()
|
|
local ZuStellen={}
|
|
for k, Auftrag in pairs(Zuglenkung_Auftreage) do
|
|
local Stellung = EEPGetSignal(Auftrag[1])
|
|
|
|
-- Rumheulen, falls es unser FSignal nicht gibt
|
|
if Stellung == 0 then
|
|
ZuglenkungMelden("FSignal ", Auftrag[1], " nicht gefunden")
|
|
Zuglenkung_Auftreage[k]=nil
|
|
|
|
-- Merken, das wir das FS-Signal schonmal aufgeloest gesehen haben
|
|
elseif Stellung == 1 then
|
|
Auftrag[3]=1
|
|
local Ziel = Auftrag[2]
|
|
if type(Ziel) == "number" then Ziel={Ziel} end
|
|
table.insert(ZuStellen, {Auftrag[1], Ziel[math.random(#Ziel)]})
|
|
|
|
-- Stellung > 1 und wir haben es vorher auf 1 gesehen -> wir waren das
|
|
elseif Auftrag[3] == 1 then
|
|
ZuglenkungMelden(string.format("FS %04d-%02d",Auftrag[1],Stellung-1)," geschaltet")
|
|
Auftrag = Auftrag[4]
|
|
Zuglenkung_Auftreage[k]=nil
|
|
if Auftrag then
|
|
ZuglenkungAuftrag(Auftrag)
|
|
return
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Stellversuche durchmischen
|
|
for i=#ZuStellen, 2, -1 do
|
|
local j = math.random(#ZuStellen)
|
|
ZuStellen[i], ZuStellen[j] = ZuStellen[j], ZuStellen[i]
|
|
end
|
|
|
|
-- Stellversuche durchfuehren
|
|
for i=1, #ZuStellen do
|
|
EEPSetSignal(ZuStellen[i][1], ZuStellen[i][2]+1, 1)
|
|
end
|
|
|
|
speicherTabelle(Zuglenkung_Slot, Zuglenkung_Auftreage)
|
|
end
|
|
|
|
function Zuglenkung_Beschreiben()
|
|
txt=""
|
|
for k, Auftrag in pairs(Zuglenkung_Auftreage) do
|
|
txt=txt.."FS "..Auftrag[1].." auf "..__tostring(Auftrag[2])
|
|
while Auftrag[3] do
|
|
Auftrag=Auftrag[3]
|
|
txt=txt..", dann "..Auftrag[1].." auf "..__tostring(Auftrag[2])
|
|
end
|
|
txt=txt.."\n"
|
|
end
|
|
return txt
|
|
end
|