Neu: MultiOn und MultiSchalten

This commit is contained in:
Nero 2023-07-22 13:49:32 +00:00
parent b475984433
commit 6a87cb3780

74
On.lua
View File

@ -39,10 +39,80 @@ end
-- Signal-Callback registrieren -- Signal-Callback registrieren
function OnSignal(Signal, Funktion) function OnSignal(Signal, Funktion)
On("EEPOnSignal_"..tostring(Signal), Funktion) On(string.format("EEPOnSignal_%d", Signal), Funktion)
end end
-- Weichen-Callbacks registrieren -- Weichen-Callbacks registrieren
function OnSwitch(Switch, Funktion) function OnSwitch(Switch, Funktion)
On("EEPOnSwitch_"..tostring(Switch), Funktion) On(string.format("EEPOnSwitch_%d", Switch), Funktion)
end
-- Cache fuer die Info, ob sich hinter einer ID eine Weiche oder ein Signal verbirgt
local Types = {}
-- Einen Callback fuer mehrere Signale oder Weichen registrieren
-- Wurden mehrere Signale oder Weichen aus der Liste umgestellt, wird unsere Funktion trotzdem nur einmal aufgerufen
-- Man stelle sich vor, die Liste habe ein Ks-Hauptsignal und einen Zs3-Zusatzanzeiger, die man jetzt als Einheit abfragen moechte.
function MultiOn(Liste, Funktion)
-- Jede MultiOn() hat eine eigene Instanz dieser Liste
local Stellungen = {}
for Position, ID in pairs(Liste) do
-- Wir merken uns, was ein Signal ist und was eine Weiche
if Types[Position] == nil then
Types[Position]=(EEPGetSwitch(ID)==0 and "Signal" or "Switch")
end
-- Aus dem Typ und unserer ID errechnen, wie unser Callback heisst
local Callback=string.format("EEPOn%s_%d", Types[Position], ID)
-- Callback definieren, welcher sich die Stellung merkt
-- Wenn ein Signal Verzoegerung aktiviert hat, kriegen wir den echten Wert nur via Callback!
On(Callback, function(Stellung)
Stellungen[Position]=Stellung
end)
end
-- Nach den Callbacks wird die EEPMain ausgefuhert, da haengen wir uns dran
Main(function()
-- Wenn Stellungen leer ist, hat es fuer uns keine Callbacks gegeben, nix tun
if next(Stellungen) == nil then return end
-- Jetzt bauen wir die Parameter fuer die Userfunktion zusammen.
local Parameter = {}
for i=1,#Liste do
-- Bevorzugt den gemerkten Wert aus den Callback nehmen
if Stellungen[i] ~= nil then
Parameter[i]=Stellungen[i]
-- Wenn es den nicht gibt, nochmal EEP abfragen
elseif Types[i] == "Signal" then
Parameter[i]=EEPGetSignal(Liste[i])
elseif Types[i] == "Switch" then
Parameter[i]=EEPGetSwitch(Liste[i])
end
end
-- Wir haben die Parameter zusammen, damit rufen wir jetzt die Funktion auf
Funktion(table.unpack(Parameter))
-- Stellungen der Callbacks leeren, sie sind jetzt verarbeitet
Stellungen={}
end)
end
function MultiSchalten(Wenn, Dann)
assert(#Wenn%2==0)
assert(type(Dann)=="function" or #Dann%2==0)
local IDs = {}
local Soll = {}
for i=1,#Wenn,2 do
table.insert(IDs, Wenn[i])
table.insert(Soll, Wenn[i+1])
end
MultiOn(IDs, function(...)
local Ist = {...}
for i=1,#Soll do
if Ist[i] ~= Soll[i] then return end
end
if type(Dann)=="table" then
for i=1,#Dann,2 do
EEPSetSignal(Dann[i], Dann[i+1], 1)
end
elseif type(Dann)=="function" then
Dann()
end
end)
end end