kskit/init.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