Neuer Callback-Handler
This commit is contained in:
parent
2c8372bc9e
commit
52d1143fd4
48
On.lua
Normal file
48
On.lua
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
-- Schluessel ist der Callback-Name, Wert ist eine Tabelle mit den Funktionen
|
||||||
|
local Callbacks = {}
|
||||||
|
|
||||||
|
function On(Name, UserFunktion)
|
||||||
|
-- Das folgende muss nur fuer den ersten Aufruf je Callback gemacht werden
|
||||||
|
-- Spaetere Aufrufe koennen mit dem exitierenden Eintrag weiterarbeiten
|
||||||
|
if not Callbacks[Name] then
|
||||||
|
-- Wenn der User den Callback bereits definiert hat, alles abbrechen
|
||||||
|
-- Sonst kommt schwer nachzuvollziehende Gruetze raus
|
||||||
|
assert(_G[Name] == nil, Name.." bereits definiert")
|
||||||
|
-- Bei Weichen und Signalen muss der Callback registriert werden
|
||||||
|
-- Item ist entweder "Switch" oder "Signal"
|
||||||
|
local Item, Number = string.match(Name, 'EEPOn(.+)_(%d+)')
|
||||||
|
if Number ~= nil then
|
||||||
|
local RegisterFunc="EEPRegister"..Item
|
||||||
|
local ok = _G[RegisterFunc](Number)
|
||||||
|
if (ok==0) then print(RegisterFunc.."("..Number..") fehlgeschlagen") end
|
||||||
|
end
|
||||||
|
-- Tabelleneintrag fuer diesen Callback eroeffnen
|
||||||
|
Callbacks[Name] = {}
|
||||||
|
-- Hier erstellen wir den echten Callback, welcher dann von EEP aufgerufen wird
|
||||||
|
-- und der jede in unserer Tabelle eingetragene Funktion aufruft
|
||||||
|
_G[Name] = function(...)
|
||||||
|
for _, UserFunktion in pairs(Callbacks[Name]) do
|
||||||
|
UserFunktion(...)
|
||||||
|
end
|
||||||
|
-- Wir sind vielleicht die EEPMain und muessen daher 1 zurueckgeben
|
||||||
|
return 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- Die uns gegebene Funktion an unseren Tabelleneintrag anhaengen
|
||||||
|
table.insert(Callbacks[Name], UserFunktion)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- EEPMain-Callback registrieren
|
||||||
|
function Main(Funktion)
|
||||||
|
On("EEPMain", Funktion)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Signal-Callback registrieren
|
||||||
|
function OnSignal(Signal, Funktion)
|
||||||
|
On("EEPOnSignal_"..tostring(Signal), Funktion)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Weichen-Callbacks registrieren
|
||||||
|
function OnSwitch(Switch, Funktion)
|
||||||
|
On("EEPOnSwitch_"..tostring(Switch), Funktion)
|
||||||
|
end
|
120
README.md
120
README.md
@ -6,14 +6,14 @@ lang: de
|
|||||||
|
|
||||||
# KsKit für Eisenbahn.exe
|
# KsKit für Eisenbahn.exe
|
||||||
|
|
||||||
KsKit sind ein paar Lua-Scripte und Anleitungen, welche ich auf meinen Anlagen nutze.
|
KsKit sind ein paar Lua-Scripte, welche ich auf meinen Anlagen nutze.
|
||||||
Von denen habe ich ein paar Dokumentiert, sie sind bisweilen recht nützlich.
|
Von denen habe ich ein paar Dokumentiert, sie sind bisweilen recht nützlich.
|
||||||
Es ist auch immer dazugeschrieben, welche Vorraussetzungen man braucht.
|
Es ist auch immer dazugeschrieben, welche Vorraussetzungen man braucht.
|
||||||
|
|
||||||
Alle Scripte können [hier](https://github.com/nero/kskit/archive/refs/heads/master.zip) als Zip-Datei heruntergeladen werden, die lässt sich dann wie ein Modell installieren.
|
Alle Scripte können [hier](https://github.com/nero/kskit/archive/refs/heads/master.zip) als Zip-Datei heruntergeladen werden, die lässt sich dann wie ein Modell installieren.
|
||||||
Die Teilscripte werden in den LUA-Ordner im EEP-Stammverzeichnis installiert.
|
Die Scripte werden unterhalb vom LUA-Ordner im EEP-Stammverzeichnis installiert.
|
||||||
|
|
||||||
## Tabellen in EEP-Slots speichern
|
## Serializer: Tabellen in EEP-Slots speichern
|
||||||
|
|
||||||
Die Lua-Umgebung wird von EEP in bestimmten Situationen zurückgesetzt und verliert dabei die Inhalte aller Variablen.
|
Die Lua-Umgebung wird von EEP in bestimmten Situationen zurückgesetzt und verliert dabei die Inhalte aller Variablen.
|
||||||
Daher müssen persistente Werte via `EEPSaveData` gespeichert und nach dem Reset wieder geladen werden.
|
Daher müssen persistente Werte via `EEPSaveData` gespeichert und nach dem Reset wieder geladen werden.
|
||||||
@ -29,7 +29,7 @@ Sie nimmt ein Argument und gibt eine Zeichenkette zurück.
|
|||||||
Der Return-Wert ist gültiges Lua und kann mittels `load()`-Funktion wieder in die Tabellenform zurückgewandelt werden.
|
Der Return-Wert ist gültiges Lua und kann mittels `load()`-Funktion wieder in die Tabellenform zurückgewandelt werden.
|
||||||
|
|
||||||
```
|
```
|
||||||
require("Serializer")
|
require("kskit\\Serializer")
|
||||||
|
|
||||||
Tabelle={
|
Tabelle={
|
||||||
str = "abcdef",
|
str = "abcdef",
|
||||||
@ -57,7 +57,7 @@ Daher wird das Zwischenergebnis nochmal in ein `urlencode`-ähnliches Format umk
|
|||||||
Dabei werden sämtliche Steuerzeichen und Hochkommas sicher verpackt.
|
Dabei werden sämtliche Steuerzeichen und Hochkommas sicher verpackt.
|
||||||
|
|
||||||
```
|
```
|
||||||
require("Serializer")
|
require("kskit\\Serializer")
|
||||||
|
|
||||||
Tabelle={
|
Tabelle={
|
||||||
str = "abcdef",
|
str = "abcdef",
|
||||||
@ -82,9 +82,9 @@ Dabei wird das `urlencode` wieder entfernt und die Daten mittels `load`-Funktion
|
|||||||
Ist der Slot unleserlich oder wurde in diesen noch keine Tabelle geschrieben, wird eine Warnmeldung in das Ereignisfenster geschrieben und eine leere Tabelle zurückgegeben.
|
Ist der Slot unleserlich oder wurde in diesen noch keine Tabelle geschrieben, wird eine Warnmeldung in das Ereignisfenster geschrieben und eine leere Tabelle zurückgegeben.
|
||||||
|
|
||||||
```
|
```
|
||||||
require("Serializer")
|
require("kskit\\Serializer")
|
||||||
|
|
||||||
dump(ladeTabelle(1))
|
print(serialize(ladeTabelle(1)))
|
||||||
-- Ausgabe: {bol=true,lst={1,2,3},str="abcdef"}
|
-- Ausgabe: {bol=true,lst={1,2,3},str="abcdef"}
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -100,7 +100,7 @@ Die Kontakte und Callbacks werden davor abgearbeitet.
|
|||||||
Daher reicht es aus, wenn die Tabelle nur einmalig am Ende der EEPMain zurückgeschrieben wird.
|
Daher reicht es aus, wenn die Tabelle nur einmalig am Ende der EEPMain zurückgeschrieben wird.
|
||||||
|
|
||||||
```
|
```
|
||||||
require("Serializer")
|
require("kskit\\Serializer")
|
||||||
|
|
||||||
-- Die Tabelle wird nur beim Starten von Lua einmal geladen
|
-- Die Tabelle wird nur beim Starten von Lua einmal geladen
|
||||||
Zugdaten_Slotnummer = 1
|
Zugdaten_Slotnummer = 1
|
||||||
@ -127,3 +127,107 @@ function EEPMain()
|
|||||||
return 1
|
return 1
|
||||||
end
|
end
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## On: Multiple Callbacks
|
||||||
|
|
||||||
|
Bestimmte Mechanismen erfordern das automatische Registrieren von zahlreichen Signal- oder Weichencallbacks.
|
||||||
|
Bei KsKit ist es erforderlich, das unterschiedliche Module ihre eigenen Callbacks registrieren können, ohne voneinander Wissen zu müssen.
|
||||||
|
Daher bietet das `On`-Modul die Möglichkeit, beliebig viele Funktionen für einen Callback zu registrieren.
|
||||||
|
Ruft EEP dann den Callback auf, werden alle für diesen Callback registrierten Funktionen aufgerufen.
|
||||||
|
|
||||||
|
Das ganze ist sehr bequem, wenn man eine große Anzahl Callbacks mittels for-Schleife aus einer Tabelle erzeugt.
|
||||||
|
|
||||||
|
### On
|
||||||
|
|
||||||
|
So wie das Modul heisst auch die zentrale Funktion.
|
||||||
|
Diese registriert eine Funktion für einen EEP-Callback.
|
||||||
|
Das Anlegen der Callback-Funktion wird bei dem Registrieren der ersten Funktion vorgenommen.
|
||||||
|
Dabei wird, falls notwendig, der Callback von `On` auch bei EEP registriert.
|
||||||
|
Das händische Aufrufen von `EEPRegister*` entfällt!
|
||||||
|
|
||||||
|
Als erster Parameter wird dabei der Name des Callbacks als String übergeben.
|
||||||
|
Als zweiter Parameter wird eine Funktion übergeben.
|
||||||
|
|
||||||
|
Man beachte die Syntax: Es wird eine Funktion ohne Namen verwendet, ebenfalls ist die Funktion innerhalb der Parameterübergabe definiert.
|
||||||
|
Die Funktion wird nicht ausgeführt, sondern selbst als Wert übergeben.
|
||||||
|
|
||||||
|
Der übergebenen Funktion werden die Callback-Parameter weitergeleitet, als wäre sie selbst von EEP aufgerufen worden.
|
||||||
|
|
||||||
|
```
|
||||||
|
require("kskit\\On")
|
||||||
|
|
||||||
|
On("EEPOnTrainCoupling", function(Zug_A, Zug_B, Zug_neu)
|
||||||
|
print(" Aus "Zug_A.." und "..Zug_B.." wurde "..Zug_neu)
|
||||||
|
end)
|
||||||
|
```
|
||||||
|
|
||||||
|
Das ganze in längerer Form mit Umweg über eine Variable:
|
||||||
|
|
||||||
|
```
|
||||||
|
require("kskit\\On")
|
||||||
|
|
||||||
|
callback4=function(Zug_A, Zug_B, Zug_neu)
|
||||||
|
print(" Aus "Zug_A.." und "..Zug_B.." wurde "..Zug_neu)
|
||||||
|
end
|
||||||
|
|
||||||
|
On("EEPOnTrainCoupling", callback4)
|
||||||
|
```
|
||||||
|
|
||||||
|
Diese Funktion wird im Hintergrund von allen anderen Funktionen des `On`-Moduls benutzt.
|
||||||
|
|
||||||
|
### OnSignal
|
||||||
|
|
||||||
|
Die wohl meistgenutzte Funktion dieses Modules.
|
||||||
|
Als ersten Parameter nimmt sie die ID eines Signales, als zweiten Parameter nimmt sie eine Funktion.
|
||||||
|
Die übergebene Funktion bekommt die Parameter wie üblich übergeben.
|
||||||
|
Der Aufruf von `EEPRegisterSignal` erfolgt automatisch.
|
||||||
|
|
||||||
|
Hier werden zwei anonyme Funktionen an ein Signal gebunden:
|
||||||
|
|
||||||
|
```
|
||||||
|
require("kskit\\On")
|
||||||
|
|
||||||
|
OnSignal(3, function(Stellung)
|
||||||
|
print("Signal 3 zeigt "..tonumber(Stellung))
|
||||||
|
end)
|
||||||
|
|
||||||
|
OnSignal(3, function(Stellung)
|
||||||
|
print("Signal umgestellt")
|
||||||
|
end)
|
||||||
|
```
|
||||||
|
|
||||||
|
Man beachte die sich schließende Klammer nach dem `end`.
|
||||||
|
|
||||||
|
Es können auch vorhandene Funktionen mittels Namen an `OnSignal` übergeben werden:
|
||||||
|
|
||||||
|
```
|
||||||
|
require("kskit\\On")
|
||||||
|
|
||||||
|
OnSignal(4, print)
|
||||||
|
```
|
||||||
|
|
||||||
|
In dem Falle wird die neue Signalstellung direkt an `print` weitergegeben und ausgegeben.
|
||||||
|
|
||||||
|
### OnSwitch
|
||||||
|
|
||||||
|
Das selbe wie `OnSignal`, nur für Weichen statt für Signale.
|
||||||
|
|
||||||
|
### Main
|
||||||
|
|
||||||
|
Jetzt muss man wissen, die `EEPMain` ist auch nur ein Callback, mit dem Unterschied, das er ohne Grund immer wieder aufgerufen wird.
|
||||||
|
Dafür gibt es in diesem Modul eine `Main`-Funktion.
|
||||||
|
Diese Funktion nimmt nur einen Parameter, jener beinhaltet die Funktion, welche an die `EEPMain` gebunden werden soll.
|
||||||
|
|
||||||
|
```
|
||||||
|
require("kskit\\On")
|
||||||
|
require("Zugtuersteuerung_FS2.lua")
|
||||||
|
|
||||||
|
-- Definitionen für RUS-Packet hier
|
||||||
|
|
||||||
|
# RUS-Packet von Parry36 aktivieren
|
||||||
|
Main(inEEPMain)
|
||||||
|
# Zugtuersteuerung vom Fried aktivieren
|
||||||
|
Main(BewegeZugtueren)
|
||||||
|
```
|
||||||
|
|
||||||
|
`Main(...)` ist auch nichts weiteres als ein Bequemlichkeits-Aufruf von `On("EEPMain", ...)`
|
||||||
|
Loading…
Reference in New Issue
Block a user