Neu: MultiOn und MultiSchalten
This commit is contained in:
parent
b475984433
commit
6a87cb3780
74
On.lua
74
On.lua
@ -39,10 +39,80 @@ end
|
||||
|
||||
-- Signal-Callback registrieren
|
||||
function OnSignal(Signal, Funktion)
|
||||
On("EEPOnSignal_"..tostring(Signal), Funktion)
|
||||
On(string.format("EEPOnSignal_%d", Signal), Funktion)
|
||||
end
|
||||
|
||||
-- Weichen-Callbacks registrieren
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user