From 6a87cb3780632c3ff509587a7f1c5623fbac3b4d Mon Sep 17 00:00:00 2001 From: Nero <41307858+nero@users.noreply.github.com> Date: Sat, 22 Jul 2023 13:49:32 +0000 Subject: [PATCH] Neu: MultiOn und MultiSchalten --- On.lua | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 72 insertions(+), 2 deletions(-) diff --git a/On.lua b/On.lua index 4dd37bf..9047dd6 100644 --- a/On.lua +++ b/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