kskit/Zuggreifer.lua

113 lines
4.3 KiB
Lua

function ZuggreiferMelden(...)
local Zeitstempel = string.format("%02d:%02d:%02d", EEPTimeH, EEPTimeM, EEPTimeS)
print(Zeitstempel," Zuggreifer: ",...)
end
-- Erwartet im Anlagenscript definierte Zuggreifer-Tabelle:
-- Schluessel ist die Signal-ID
-- Wert ist eine Liste von Gleisen vor dem Signal
-- Fuehrt das Gleis vom Signal weg statt hin, wird die ID negativ angegeben
function ZuggreiferInstallieren(Optionen)
if type(EEPRollingstockGetOrientation) ~= "function" and Optionen.FahrzeugeGleicheRichtung ~= true then
error("Zuggreifer erfordert mindestens EEP 15 Plugin 1")
end
if type(EEPRollingstockGetTrack) ~= "function" then
error("Zuggreifer erfordert mindestens EEP 15")
end
if type(Zuggreifer) ~= "table" then
error("Zuggreifer findet seine Tabelle nicht")
end
if type(leseSignal) ~= "function" then
error("Zuggreifer findet leseSignal() nicht")
end
if Optionen == nil then Optionen={} end
for Signal, Schienen in pairs(Zuggreifer) do
if EEPGetSignal(Signal) == 0 then
ZuggreiferMelden("finde Signal "..Signal.." nicht")
end
-- Schienen fuer die Gleisbesetztabfrage registrieren
for i=1,#Schienen do
local SchienenID = math.abs(Schienen[i])
if not EEPRegisterRailTrack(SchienenID) then
ZuggreiferMelden("Signal "..Signal.." findet Gleis "..SchienenID.." nicht")
end
end
-- Vorherigen Callback retten
local CallbackName = "EEPOnSignal_"..tostring(Signal)
local VorherigerCallback = _G[CallbackName]
-- Wenn der User vorher EEPRegisterSignal vergessen hat, holen wirs nicht nach.
-- Das darf nicht sein das es der User vergisst und es funktioniert trotzdem.
if VorherigerCallback == nil then
EEPRegisterSignal(Signal)
end
-- Callback registrieren
_G[CallbackName]=function(Stellung)
-- Vorherigen Callback trotzdem ausfuehren
if VorherigerCallback ~= nil then
VorherigerCallback(Stellung)
end
-- Nix tun, wenn das Signal auf Halt gestellt wurde
local Fahrt, V_max = leseSignal(Signal)
if not Fahrt then return end
if type(V_max) ~= "number" then V_max = Optionen.V end
if type(V_max) ~= "number" then V_max = 40 end
-- Zug ermitteln
local Zugname, Richtung = ZuggreiferAbfragen(Zuggreifer[Signal])
-- Erfolg melden
if Optionen.Melden then
ZuggreiferMelden("Signal ",Signal," hat ",Zugname and Zugname or "ins Leere"," gegriffen")
end
-- Abfahrbefehl erteilen
if Zugname then
if type(AnimiereAbfahrt) == "function" then
AnimiereAbfahrt(Zugname, V_max * Richtung)
else
EEPSetTrainSpeed(Zugname, V_max * Richtung)
end
end
end
end
end
-- Schienen ist eine Liste von Gleis-IDs
-- Negative ID wenn andersherum verlegt
function ZuggreiferAbfragen(Schienen)
local Zugname = nil
local SchienenMap = {}
local Besetzt = false
local ok
-- Testen, ob hier ueberhaupt was steht
for i=1,#Schienen do
local SchienenID = math.abs(Schienen[i])
SchienenMap[SchienenID] = Schienen[i] > 0 and 1 or -1
if not Besetzt then
ok, Besetzt, Zugname = EEPIsRailTrackReserved(SchienenID , true)
if not ok then
error("Zuggreifer kann Gleis "..SchienenID.." nicht abfragen, wurde das Gleis registriert?")
end
end
end
-- Wenn hier ein Zug steht, dann...
if Zugname then
-- Alle Fahrzeuge durchgehen
local AnzahlFahrzeuge = EEPGetRollingstockItemsCount(Zugname)
for i=0,AnzahlFahrzeuge-1 do
local FahrzeugName = EEPGetRollingstockItemName(Zugname, i)
-- Testen, ob das Fahrzeug auf einen von "unseren" Gleisen steht
local ok, Gleis, _, FahrzeugRichtung, _ = EEPRollingstockGetTrack(FahrzeugName)
if not ok then return Zugname, 0 end
if SchienenMap[Gleis] ~= nil then
FahrzeugRichtung = FahrzeugRichtung > 0 and 1 or -1
-- Richtung des Fahrzeugs im Zug ermitteln, benoetigt EEP 15 Plugin 1
local FahrzeugVorwaerts = true
if type(EEPRollingstockGetOrientation) == "function" then
_, FahrzeugVorwaerts = EEPRollingstockGetOrientation(FahrzeugName)
end
-- Richtung zusammenmultiplizieren und mit Zugnamen zurueckgeben
return Zugname, SchienenMap[Gleis] * ( FahrzeugRichtung > 0 and 1 or -1) * (FahrzeugVorwaerts and 1 or -1)
end
end
end
return nil, 0
end