Arbeit an Dokumentation
This commit is contained in:
parent
278f9c7b22
commit
269f7f6054
270
README.md
270
README.md
@ -13,48 +13,152 @@ 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 Scripte werden unterhalb vom LUA-Ordner im EEP-Stammverzeichnis installiert.
|
Die Scripte werden unterhalb vom LUA-Ordner im EEP-Stammverzeichnis installiert.
|
||||||
|
|
||||||
## MultiSchalten: Signalverknüpfung mit mehreren Bedingungen
|
## On-Modul
|
||||||
|
|
||||||
Bei der Verwendung der Ks-Signale von GK3 hatte ich schnell das Problem, das ich keine Ansteuerung für die Mehrabschnittssignale hatte.
|
Bisher konnte an jedes Signal oder Weiche nur ein Callback gebunden werden.
|
||||||
MA-Signale haben neben der Hauptsignalfunktion noch eine Vorsignalfunktion.
|
Das ist kein Problem, wenn man das Anlagenscript komplett selber schreibt.
|
||||||
|
Sobald man aber mehrere Module hat, welche unabhängig voneinander Callbacks definieren, braucht man einen Mechanismus, um die alle unter einen Hut zu kriegen.
|
||||||
|
|
||||||
In einer Fahrstrasse nehme ich das MA-Signal in der Stellung "Halt erwarten" auf, mitsamt eventuellen Geschwindigkeits-Zusatzanzeigern.
|
Als Lösung dafür erfolgt mit dem `On`-Modul ein Paradigmenwechsel.
|
||||||
Wenn das Folgesignal dann von Halt auf Fahrt springt, UND das MA-Signal nicht bereits wieder Halt zeigt, nur dann soll es von Halt erwarten auf Fahrt umgestellt werden können.
|
Anstelle den Callback direkt als Funktion zu definieren, wird der Callbackname und eine anonyme Funktion an das Modul übergeben.
|
||||||
|
|
||||||
Mit den klassischen Signalverknüpfungen ist die Abfrage von diesen zwei Bedingungen nicht möglich.
|
Die bisherige Syntax für Callbacks und die EEPMain sah wie folgt aus:
|
||||||
|
|
||||||
Daher habe ich eine Lua-basierte Signalverknüpfung geschrieben, die mehrere Bedingungen abfragen kann.
|
|
||||||
Die Verknüpfungen werden dabei in einer Tabelle eingetragen.
|
|
||||||
Jede Zeile in der Tabelle hat dabei zwei gleichartige Listen.
|
|
||||||
Die Listen beinhalten jeweils die ID und die Stellung eines Signals, jeweils abwechselnd.
|
|
||||||
Anstelle von Signalen können auch Weichen eingetragen werden.
|
|
||||||
In der `Wenn`-Liste werden die Bedigungen eingetragen, sie müssen alle erfüllt sein, damit die Zeile Wirkung zeigt.
|
|
||||||
In der `Dann`-Liste werden alle zu stellenden Signale und Weichen eingetragen.
|
|
||||||
|
|
||||||
```
|
```
|
||||||
require("kskit\\MultiSchalten")
|
EEPRegisterSignal(5)
|
||||||
|
function EEPOnSignal_5(Stellung)
|
||||||
Schalten={
|
...
|
||||||
-- 73 ist unser MA-Signal, 2=Halt erwarten, 3=Fahrt
|
end
|
||||||
-- 16 ist das Folgesignal, 2=Fahrt
|
|
||||||
{Wenn={16,2,73,2}, Dann={73,3}},
|
|
||||||
-- 1073 und 2073 sind Zusatzanzeiger, wenn wir auf Rot (1) gehen müssen die aus
|
|
||||||
{Wenn={73,1}, Dann={1073,1,2073,1}}
|
|
||||||
}
|
|
||||||
|
|
||||||
MultiSchaltenInit(Schalten)
|
|
||||||
|
|
||||||
function EEPMain()
|
function EEPMain()
|
||||||
MultiSchaltenMain()
|
...
|
||||||
return 1
|
|
||||||
end
|
end
|
||||||
```
|
```
|
||||||
|
|
||||||
Die Ausführung erfolgt einmalig nach dem Eintreffen der jeweiligen Callbacks.
|
Die Verwendung des On-Modules erfordert eine andere Syntax.
|
||||||
|
|
||||||
Zum das Anlegen der Callbacks wird das `On`-Modul (folgend) verwendet.
|
```
|
||||||
Ist ein Signal oder Weiche als Bedingung in der MultiSchalten-Tabelle eingetragen, darf dazu keine `EEPOnSignal_`-Funktion definiert werden!
|
require("kskit\\On")
|
||||||
Es sind die OnSignal/OnSwitch-Funktionen des `On`-Moduls stattdessen zu benutzen.
|
|
||||||
|
OnSignal(5, function(Stellung)
|
||||||
|
...
|
||||||
|
end)
|
||||||
|
|
||||||
|
Main(function()
|
||||||
|
...
|
||||||
|
end)
|
||||||
|
```
|
||||||
|
|
||||||
|
Die Callback-Funktion wird nicht mehr auf der globalen Ebene definiert, sondern als Argument an eine andere Funktion übergeben.
|
||||||
|
Daher auch die sich schließende Klammer nach dem `end` - sie schließt den Funktionsaufruf von OnSignal/Main ab.
|
||||||
|
|
||||||
|
Das ist umständlich, das ist ungewohnt, ermöglicht aber einige Vorteile:
|
||||||
|
|
||||||
|
- Die On-Funktionen können mehrmals aufgerufen werden, mehrere Funktionen an einem EEP Callback sind kein Problem
|
||||||
|
- Module können unabhängig voneinander Code durch einen Callback ausführen lassen
|
||||||
|
- Module können unabhängig voneinander ihre eigene EEPMain definieren
|
||||||
|
|
||||||
|
Ebenfalls werden zwei größere Fehlerquellen ausgeschlossen:
|
||||||
|
|
||||||
|
- Der Aufruf von EEPRegisterSignal/EEPRegisterSwitch wird vom `On`-Module automatisch gemacht
|
||||||
|
- Bei dem Anlegen von Signal/Weichencallbacks wird die Existenz dieser Objekte überprüft
|
||||||
|
|
||||||
|
Zum Beispiel können eine Vorsignalsteuerung und eine Türsteuerung beide einen Callback auf das Abfahrtssignal registrieren, ohne voneinander zu wissen zu müssen.
|
||||||
|
|
||||||
|
### 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", ...)`
|
||||||
|
|
||||||
## Serializer: Tabellen in EEP-Slots speichern
|
## Serializer: Tabellen in EEP-Slots speichern
|
||||||
|
|
||||||
@ -170,107 +274,3 @@ 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