74 lines
2.6 KiB
Lua
74 lines
2.6 KiB
Lua
|
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
|