160 lines
4.9 KiB
Lua
160 lines
4.9 KiB
Lua
-- Versionsnummer. Diese dient vor allem zu Diagnosezwecken.
|
|
-- Ich weiss jetzt noch nicht, wie viele verschiedene Versionen von dem Script spaeter herumfliegen werden.
|
|
KsKitVer=0
|
|
|
|
-- Uebrige Konstanten
|
|
Vmax=400
|
|
|
|
-- Tabelle, in der alle Lambda-Funktionen gespeichert werden
|
|
-- Die Eintragung erfolgt durch die MainFunktion() vom Zielort aus.
|
|
MainFunktionTabelle={}
|
|
|
|
-- Neues Main-Lambda registrieren
|
|
function MainFunktion(Funktion)
|
|
table.insert(MainFunktionTabelle, Funktion)
|
|
end
|
|
|
|
-- Alle Main-Lambda's ausfuehren
|
|
-- Dies ersetzt die Standard-EEP-Main Funktion.
|
|
function EEPMain()
|
|
for cnt = 1, #MainFunktionTabelle do
|
|
MainFunktionTabelle[cnt]()
|
|
end
|
|
return 1
|
|
end
|
|
|
|
-- Neues Signal-Lambda registrieren
|
|
SignalFunktionen = {}
|
|
function SignalFunktion(Signal, Funktion)
|
|
if not SignalFunktionen[Signal] then
|
|
EEPRegisterSignal(Signal)
|
|
-- Callback bei EEP registrieren
|
|
_G["EEPOnSignal_"..tostring(Signal)]=function(Stellung)
|
|
-- Alle registrierten Lambdas ausfuehren
|
|
for cnt = 1, #SignalFunktionen[Signal] do
|
|
SignalFunktionen[Signal][cnt](Stellung)
|
|
end
|
|
end
|
|
SignalFunktionen[Signal]={}
|
|
end
|
|
-- In unsere eigene Tabelle eintragen
|
|
table.insert(SignalFunktionen[Signal], Funktion)
|
|
end
|
|
|
|
-- Lua-Serializer und Deserializer laden
|
|
serpent=require("kskit/serpent")
|
|
|
|
-- Lua-Tabelle aus EEP Slot laden
|
|
function ladeTabelle(Slot)
|
|
local roh, geparst
|
|
ok, roh = EEPLoadData(Slot)
|
|
if not ok then return {} end
|
|
ok, geparst = serpent.load(roh)
|
|
if not ok then return {} end
|
|
if type(geparst) ~= "table" then return {} end
|
|
return geparst
|
|
end
|
|
|
|
-- Lua-Tabelle in EEP Slot speichern
|
|
function speicherTabelle(Slot, Tabelle)
|
|
EEPSaveData(Slot, serpent.line(Tabelle, {comment = false}))
|
|
end
|
|
|
|
SignalLesenFunktionen={}
|
|
|
|
-- Definiere ein Signal
|
|
-- Signal: ID-Nummer
|
|
-- Haltstellung: Nummer der Haltstellung, meistens 1
|
|
-- SchaltFunk: Callback, wird wiederholt aufgerufen, um Fahrt-Stellung des Signals zu erwirken
|
|
-- AbmeldeFunk: Wird nach Durchfahrt am Signal aufgerufen
|
|
function Basissignal(Signal, Haltstellung, SchaltFunk, AbmeldeFunk)
|
|
if EEPGetSignal(Signal)==0 then
|
|
print("Anlagen-Fehler: ID ",Signal," ist kein Signal")
|
|
return
|
|
end
|
|
-- Funktion, damit anderer Programmcode das Signal lesen kann
|
|
SignalLesenFunktionen[Signal]=function()
|
|
local Stellung = EEPGetSignal(Signal)
|
|
if Stellung == 0 or Stellung == Haltstellung then
|
|
return false, 0
|
|
end
|
|
return true, Vmax
|
|
end
|
|
-- Funktion fuer Kontaktpunkte: Zug an Signal anmelden
|
|
_G["Anmeldung_"..tostring(Signal)] = function(Zug)
|
|
local Anmeldung
|
|
Anmeldung = ladeTabelle(Signal)
|
|
if Anmeldung.train and Anmeldung.train ~= Zug then return end
|
|
Anmeldung.train = Zug
|
|
speicherTabelle(Signal, Anmeldung)
|
|
end
|
|
-- Auftragsstatus pollen
|
|
MainFunktion(function()
|
|
local Anmeldung = ladeTabelle(Signal)
|
|
-- Wenn Zug vor Signal steht, Anmeldung ggf. nachholen
|
|
if EEPGetSignalTrainsCount(Signal) > 0 then
|
|
if Anmeldung.train == nil then
|
|
Anmeldung.train = EEPGetSignalTrainName(Signal, 1)
|
|
speicherTabelle(Signal, Anmeldung)
|
|
end
|
|
-- Ankunftszeit merken, sobald Zug am Signal angekommen ist
|
|
-- Wird im if von EEPGetSignalTrainsCount gemacht,
|
|
-- damit nur Halte an diesem Signal zaehlen
|
|
if Anmeldung.arrival == nil then
|
|
ok, speed = EEPGetTrainSpeed(Anmeldung.train)
|
|
if math.abs(speed) < 5 then
|
|
Anmeldung.arrival = EEPTime
|
|
speicherTabelle(Signal, Anmeldung)
|
|
end
|
|
end
|
|
end
|
|
-- Nichts tun wenn kein Zug da
|
|
if Anmeldung.train == nil then return end
|
|
-- SchaltFunk
|
|
if SchaltFunk and EEPGetSignal(Signal) == Haltstellung then
|
|
r=SchaltFunk(Anmeldung.train)
|
|
if r and r > 0 and r ~= Haltstellung then
|
|
EEPSetSignal(Signal, r, 1)
|
|
end
|
|
end
|
|
end)
|
|
-- Reaktion auf Signal-Umstellungen
|
|
SignalFunktion(Signal, function(Stellung)
|
|
if Stellung == Haltstellung then
|
|
-- Wenn Signal auf Halt gestellt wurde, mache eine Abmeldung
|
|
if AbmeldeFunk then
|
|
local Anmeldung = ladeTabelle(Signal)
|
|
AbmeldeFunk(Anmeldung.train)
|
|
end
|
|
speicherTabelle(Signal, {})
|
|
end
|
|
end)
|
|
end
|
|
|
|
-- Funktion zum Erklaeren, was ein Signal gerade so tut
|
|
-- Nimmt die Nummer des Signals als Argument
|
|
-- Gibt einen Menschenlesbaren Text zurueck
|
|
function SignalBeschreibung(Signal)
|
|
local Anmeldung = ladeTabelle(Signal)
|
|
local Fahrt, V = SignalLesenFunktionen[Signal]()
|
|
Text = "Signal " .. tonumber(Signal) .. ": "
|
|
if Fahrt then
|
|
if V < Vmax then
|
|
Text = Text .. "Fahrt mit " .. tonumber(V) .. " Km/h\n"
|
|
else
|
|
Text = Text .. "Fahrt\n"
|
|
end
|
|
else
|
|
Text = Text .. "Halt\n"
|
|
end
|
|
if Anmeldung.train then
|
|
Text = Text .. "Zug angemeldet: " .. Anmeldung.train .. "\n"
|
|
end
|
|
if Anmeldung.arrival then
|
|
local Dauer = EEPTime - Anmeldung.arrival
|
|
if Dauer < 0 then Dauer = Dauer + 24*60*60 end
|
|
Text = Text .. "Ankunft vor " .. Dauer .. " Sekunden\n"
|
|
end
|
|
return Text
|
|
end
|