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