From edd2e9f7751f63d56c1fbeabb990b51dd3bbc57e Mon Sep 17 00:00:00 2001 From: Nero <41307858+nero@users.noreply.github.com> Date: Thu, 7 Apr 2022 16:39:46 +0000 Subject: [PATCH] Initial commit --- .gitignore | 6 ++++ .gitmodules | 3 ++ Makefile | 16 +++++++++++ README.md | 65 ++++++++++++++++++++++++++++++++++++++++++++ grapho | 1 + img/einrichtung.png | Bin 0 -> 12850 bytes init.lua | 39 ++++++++++++++++++++++++++ 7 files changed, 130 insertions(+) create mode 100644 .gitignore create mode 100755 .gitmodules create mode 100755 Makefile create mode 100755 README.md create mode 160000 grapho create mode 100644 img/einrichtung.png create mode 100755 init.lua diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d94d070 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +*.html +*.pdf +*.tex +*.aux +*.log +*.out diff --git a/.gitmodules b/.gitmodules new file mode 100755 index 0000000..9f30863 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "grapho"] + path = grapho + url = ../grapho.git diff --git a/Makefile b/Makefile new file mode 100755 index 0000000..85a1613 --- /dev/null +++ b/Makefile @@ -0,0 +1,16 @@ +NAME=KsKit + +default: index.html $(NAME).pdf + +index.html: README.md + awk -f grapho/md2html <$< >$@ + +$(NAME).tex: README.md + awk -f grapho/md2tex <$< >$@ + +$(NAME).pdf: $(NAME).tex + pdflatex $< + pdflatex $< + +clean: + rm -f *.html *.pdf *.tex *.aux *.log *.out diff --git a/README.md b/README.md new file mode 100755 index 0000000..876b508 --- /dev/null +++ b/README.md @@ -0,0 +1,65 @@ +# KsKit für Eisenbahn.exe + +KsKit ist eine Sammlung von Lua-Funktionalität, welche ich auf meinen Anlagen für eine vorbildgerechte Signalisierung einsetze. +Die hier geschilderten Anwendungsfälle und Programmsnipsel stellen kein Komplettpacket dar, sondern sind eher wie ein Kuchen anzusehen, aus denen man sich ein paar Rosinen rauspicken darf. + +Aus dem Basisscript dürfen Teile entnommen werden und anderswo verwendet werden, dabei ist die Herkunft und Versionsnummer zu nennen, z.B. als Quellcode-Kommentar. +Die Versionsnummer befindet sich am Anfang des Basisscripts und kann über die Variable `KsKitVer` abgefragt werden. + +## Einrichtung + +Das KsKit-Verzeichnis wird im EEP-Stammverzeichnis, dort im LUA/ Unterverzeichnis als ganzes hin entpackt. + +![So sieht das KsKit-Verzeichnis im Windows Explorer aus](img/einrichtung.png) + +Die Einbindung vom Anlagenscript aus erfolgt mittels `require("kskit")`. + +**Wichtig**: Wenn KsKit verwendet wird, darf keine EEPMain definiert sein. + +Findet EEP die Dateien von Lua nicht, wird im Ereignisfenster eine Liste von Orten ausgegeben, an denen die Dateien gesucht wurden. +Die Orte sind in diesem Fall mit dem Installationsort abzugleichen. + +## Allgemeine Lua-Kniffe + +Bei der Entwicklung des Basisscriptes haben sich einige Mechanismen als sehr praktisch erwiesen, um die Komplexität des Codes im Zaum zu halten. + +### Mainfunktionen + +Das Basisscript bringt eine eigene EEPMain mit, daher darf von Seiten des Anlagen-Scriptes keine weitere EEPMain definiert werden. +Soll Lua-Code im Rahmen der EEPMain ausgeführt werden, wird mittels MainFunktion() eine Lambda-Funktion registriert. +Als Argument wird eine Funktion übergeben, welche keine Argumente nimmt. +Diese Funktion wird dann in jedem Zyklus einmal aufgerufen. + +Der Vorteil dieser Verfahrensweise liegt darin, das vom User keine EEPMain mit Referenzen auf verschiedene Anlagenkomponenten angelegt und aktualisiert werden muss. +Auf einer Anlage können beliebig viele Mainfunktionen eingesetzt werden. + +``` +MainFunktion(function() + if EEPGetSignalTrainsCount(1) > 0 then + EEPSetSignal(1, 1, 1) + end +end) +``` + +Dieser Programmcode bindet eine Funktion an die EEPMain. +Die Funktion fragt ab, ob vor einem Signal ein Zug steht und schaltet in diesem Falle das Signal auf Fahrt. + +### Signalfunktionen + +Analog zu den Mainfunktionen ergibt sich ein ähnliches Problem mit den Signal-Callbacks. +Ein herkömmlicher Signal-Callback kann nur an einer einzigen Stelle definiert werden. +An einigen Stellen ist es jedoch notwendig, das mehrere Stellen über ein Umschalten eines Signals informiert werden wollen. + +Mittels der SignalFunktion kann eine Funktion an ein Signal angebunden werden. +Ändert das Signal nun seine Stellung, wird die Funktion mit der neuen Stellung als Argument aufgerufen. + +Als konkretes Beispiel sind einzelnstehende Vorsignale im Bahnhofsbereich zu betrachten. +Mehere Vorsignale können von einem Hauptsignal abhängig sein und benötigen Informationen über dessen Schaltzustand als auch über den Schaltzustand der dazwischenliegenden Fahrstrasse. + +Als Beispiel wird eine Signalfunktion definiert, welche lediglich die neue Stellung eines Signals ausgibt: + +``` +SignalFunktion(1, function(Stellung) + print("Signal auf ", Stellung, " umgestellt") +end) +``` diff --git a/grapho b/grapho new file mode 160000 index 0000000..094ef7a --- /dev/null +++ b/grapho @@ -0,0 +1 @@ +Subproject commit 094ef7a2de22c7698938877eaf22b4d958722805 diff --git a/img/einrichtung.png b/img/einrichtung.png new file mode 100644 index 0000000000000000000000000000000000000000..4c90ae10c50e4f8d531c3a78765fc9bcdc81df1f GIT binary patch literal 12850 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 Og~|X8`EuD8@BR