kskit/MultiSchalten.lua

74 lines
2.6 KiB
Lua
Raw Normal View History

require("kskit\\On")
-- Die Indice der Schaltverbindungen, welche eben einen Callback reinbekommen haben und geprueft werden muessen
local IndexGeaendert={}
-- Die Tabelle mit den Schaltverbindungen, die wir vom User bekommen haben
local SchaltenTabelle={}
-- Ausgabefunktion, dummy
-- Wenn Ausgabe gewuenscht, mit MultiSchaltenMelden=print ueberschreiben
function MultiSchaltenMelden(...)
end
-- Fuer jedes Dann-Element in der Tabelle registrieren wir einen Callback
-- Dank des On-Modules koennen mehrere Zeilen einen Callback auf das selbe Signal oder Weiche eintragen
function MultiSchaltenInit(Tabelle)
SchaltenTabelle=Tabelle
for k, Eintrag in pairs(Tabelle) do
-- Grobe Fehlerueberpruefung
assert(#Eintrag.Wenn % 2 == 0, "Eintrag "..k..": Wenn-Liste muss eine gerade Anzahl Elemente haben")
assert(#Eintrag.Dann % 2 == 0, "Eintrag "..k..": Dann-Liste muss eine gerade Anzahl Elemente haben")
-- Fuer jede ID in der Liste einen Callback erstellen
for i=1,#Eintrag.Wenn,2 do
local ID=Eintrag.Wenn[i]
if EEPGetSignal(ID) > 0 then
OnSignal(ID, function()
-- Hier merken wir uns den Index unserer Zeile, das wir das von der Main aus ueberpruefen
IndexGeaendert[k]=true
end)
elseif EEPGetSwitch(ID) > 0 then
OnSwitch(ID, function()
IndexGeaendert[k]=true
end)
else
error("ID "..tostring(ID).." ist nicht vergeben")
end
end
end
end
-- Eingegangene Callbacks auswerten
function MultiSchaltenMain()
-- Nur die Zeilen auswerten, fuer die eben ein Callback eingegangen ist
for k, _ in pairs(IndexGeaendert) do
local Eintrag=SchaltenTabelle[k]
local BedingungErfuellt=true
-- Die Bedingungen durchgehen
for i=1,#Eintrag.Wenn,2 do
local ID=Eintrag.Wenn[i]
local Soll=Eintrag.Wenn[i+1]
-- Sowohl Signal als auch Switch abfragen, wir wissen ja nicht ob die ID ein Signal oder Weiche ist
if EEPGetSignal(ID) ~= Soll and EEPGetSwitch(ID) ~= Soll then
MultiSchaltenMelden("MultiSchalten "..tostring(k)..": ",ID," ist nicht ",Soll)
BedingungErfuellt=false
end
end
-- Die Folgen durchgehen
if BedingungErfuellt then
for i=1,#Eintrag.Dann,2 do
local ID=Eintrag.Dann[i]
local Soll=Eintrag.Dann[i+1]
if EEPGetSignal(ID) > 0 then
MultiSchaltenMelden("MultiSchalten "..tostring(k)..": Signal ",ID," auf ",Soll)
EEPSetSignal(ID, Soll, 1)
else
MultiSchaltenMelden("MultiSchalten "..tostring(k)..": Weiche ",ID," auf ",Soll)
EEPSetSwitch(ID, Soll, 1)
end
end
end
end
-- Gemerkte Callbacks loeschen
IndexGeaendert={}
end