130 lines
4.1 KiB
Markdown
Executable File
130 lines
4.1 KiB
Markdown
Executable File
---
|
|
author: Nero
|
|
title: KsKit für Eisenbahn.exe
|
|
lang: de
|
|
---
|
|
|
|
# KsKit für Eisenbahn.exe
|
|
|
|
KsKit sind ein paar Lua-Scripte und Anleitungen, welche ich auf meinen Anlagen nutze.
|
|
Von denen habe ich ein paar Dokumentiert, sie sind bisweilen recht nützlich.
|
|
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.
|
|
Die Teilscripte werden in den LUA-Ordner im EEP-Stammverzeichnis installiert.
|
|
|
|
## Tabellen in EEP-Slots speichern
|
|
|
|
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.
|
|
Bei Zeichenketten und Zahlen ist das kein Problem, das Speichern von Tabellen ist nicht ohne umwege möglich.
|
|
|
|
KsKit bringt einen Serializer mit, der in der Lage ist, die gängigen Lua-Daten und Tabellen in eine Zeichenkette zu serialisieren.
|
|
|
|
### Funktion serialize
|
|
|
|
Die `serialize`-Funktion ist das Herz des Serializers.
|
|
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.
|
|
|
|
```
|
|
require("Serializer")
|
|
|
|
Tabelle={
|
|
str = "abcdef",
|
|
lst = {1,2,3},
|
|
bol = true
|
|
}
|
|
|
|
print(serialize(Tabelle))
|
|
-- Ausgabe: {bol=true,lst={1,2,3},str="abcdef"}
|
|
```
|
|
|
|
Unterstützt werden Wahrheitswerte, Zeichenketten, Zahlen und einfach verschachtelte Tabellen.
|
|
Lambda-Funktionen werden ignoriert, ebenso wie rekursiv in sich selbst verschachtelte Tabellen.
|
|
|
|
### Funktion speicherTabelle
|
|
|
|
Diese Funktion macht genau das, was der Name vermuten lässt.
|
|
Eine Lua-Tabelle wird in einem EEPSlot abgespeichert.
|
|
|
|
Das erste Argument zu der Funktion ist dabei die Slotnummer, das zweite Argument eine Lua-Tabelle.
|
|
|
|
Die Tabelle wird mittels `serialize` in eine Zeichenkette umgewandelt.
|
|
Die EEPSlots unterstützen jedoch nicht alle möglichen Zeichen.
|
|
Daher wird das Zwischenergebnis nochmal in ein `urlencode`-ähnliches Format umkonvertiert.
|
|
Dabei werden sämtliche Steuerzeichen und Hochkommas sicher verpackt.
|
|
|
|
```
|
|
require("Serializer")
|
|
|
|
Tabelle={
|
|
str = "abcdef",
|
|
lst = {1,2,3},
|
|
bol = true
|
|
}
|
|
|
|
speicherTabelle(1, Tabelle)
|
|
|
|
-- So sieht der Datenslot hinterher in der Lua-Datei aus:
|
|
-- [EEPLuaData]
|
|
-- DS_1 = "{bol=true,lst={1,2,3},str=%22abcdef%22}"
|
|
```
|
|
|
|
### Funktion ladeTabelle
|
|
|
|
Das pendant zu `speicherTabelle`.
|
|
Als Argument wird die Slotnummer übergeben, als Return-Wert erhält man die vorher gespeicherte Tabelle zurück.
|
|
|
|
Dabei wird das `urlencode` wieder entfernt und die Daten mittels `load`-Funktion wieder eingelesen.
|
|
|
|
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")
|
|
|
|
dump(ladeTabelle(1))
|
|
-- Ausgabe: {bol=true,lst={1,2,3},str="abcdef"}
|
|
```
|
|
|
|
### Praxisbeispiel
|
|
|
|
Es ist nicht notwendig, eine Tabelle vor jeder Benutzung zu laden und wieder zu speichern.
|
|
|
|
Viel schneller ist es, die Tabelle als globale Variable zu halten und nur beim Lua-Start einmal einzulesen.
|
|
Die Tabelle kann dann wie jede andere Tabelle verwendet werden.
|
|
|
|
Die EEPMain wird innerhalb eines Zyklus zuletzt aufgerufen.
|
|
Die Kontakte und Callbacks werden davor abgearbeitet.
|
|
Daher reicht es aus, wenn die Tabelle nur einmalig am Ende der EEPMain zurückgeschrieben wird.
|
|
|
|
```
|
|
require("Serializer")
|
|
|
|
-- Die Tabelle wird nur beim Starten von Lua einmal geladen
|
|
Zugdaten_Slotnummer = 1
|
|
Zugdaten = ladeTabelle(Zugdaten_Slotnummer)
|
|
|
|
-- Diese Funktion wird in Kontakten eingetragen
|
|
function Richtung_Merken(Zugname)
|
|
local ok, V = EEPGetTrainSpeed(Zugname)
|
|
Zugdaten[Zugname].V = V
|
|
end
|
|
|
|
function Zug_Wenden(Zugname)
|
|
local Vneu = -Zugdaten[Zugname].V
|
|
EEPSetTrainSpeed(Zugname, Vneu)
|
|
Zugdaten[Zugname].V = Vneu
|
|
end
|
|
|
|
function EEPMain()
|
|
-- andere Dinge tun
|
|
-- ...
|
|
|
|
-- Wir sind am Ende des EEP-Zyklus, nur einmal hier speichern
|
|
speicherTabelle(Zugdaten_Slotnummer, Zugdaten)
|
|
return 1
|
|
end
|
|
```
|