Wydałem kolejną wersję, która już ma podzielony kod na dwie części - kernel i kod scenariusza. (patrz pierwszy post)
Dlaczego podzieliłem? Kernel jest obowiązkową częścią mojego systemu scenariuszy, a w przypadku znalezienia jakiegoś błędu w nim nie trzeba będzie go poprawiać w każdej scenerii oddzielnie. Jeśli chodzi o kod scenariusza, to wystarczy w scenerii
includować (załączać poprzez odnośnik) ten kod, bo każdy kod z kolei
includuje kernela. Uwaga,
PRZED (nie po!) wpisie
lua trzeba wpisać linijkę
config joinduplicatedevents yes endconfig
W przeciwnym wypadku nie będzie działać wygaszanie semaforów.
Jak pisać kod scenariusza?Na początku każdego kodu scenariusza musimy
zaincludować kernela linijką
local kernel = require "scenery/$lua_test/kernel"
Spowoduje to dołączanie dalszych poleceń do kernela, który jest nieodłączną częścią systemu. Teraz najtrudniejsza część, będziemy robić drabinkę. Nie, spokojnie, nie będziemy się bawić w kominiarza, drabinką nazywa się często złożoną strukturę danych. Będziemy bowiem robić
wszystkie zależności na scenerii. To może potrwać nawet kilka dni przy bardzo dużych sceneriach. Struktura jest w widoczny i czytelny sposób podana w przykładowym pliku LUA (scenery/$lua_test/td_mijanka.lua). Zaczynamy od wpisania linijki
inicjalizuj()
Teraz w ten nawias wpisujemy dane zgodnie ze strukturą podaną w pliku (patrz wyżej). Kilka porad:
1. Żadnego z wyrazów nie podajemy dosłownie, są one wskazówką co mamy wpisać. Typ wpisu jest podany w nawiasie, może to być:
* int - zwykła liczba, np. 3,
* string - tekst, zamknięty w cudzysłowiu, np. "Hello World!",
* bool - wartość typu prawda/fałsz, prawda = true, fałsz = false,
* array - robimy {}, wewnątrz podajemy to, co jest bardziej we wcięciu, np.
nazwy (array)
parametr1 (string)
parametr2 (array)
parametr11 (int)
parametr12 (string)
dupa (bool)
powinniśmy zapisać jako
{parametr1, {parametr11, parametr12}}, dupa
, oczywiście podstawiając, np. taki zapis jest poprawny:
{"Stacja1", {0, "Hahahaha"}}, false
2. Jeśli mamy podać nazwę semafora, zwrotnicy lub izolacji, pamiętajmy, że jeśli chodzi nam o stację, którą właśnie definiujemy, to wpisujemy
nazwaObiektu
, jeśli zaś chcemy odwołać się do np. szlaku to wpisujemy
skrótStacji_nazwaObiektu
Uwaga, wszystkie obiekty są domyślnie zapisywane w formacie skrótStacji_nazwaObiektu, jednak gdy nie podamy skrótu stacji to zostanie podany skrót stacji, którą właśnie definiujemy. Pamiętajmy o tym podczas nazywania obiektów na scenerii!3. Dzielmy odcinki izolowane tak, jak jest w rzeczywistości, nie idźmy na łatwiznę izolując całą głowicę jako jeden odcinek - uniemożliwi to prowadzenie płynniejszego ruchu na stacji.
4. Przy pisaniu przebiegów
nie podajemy toru na którym stoimy czekając na wjazd/wyjazd - kod rozpozna, że pociąg, który właśnie czeka na podanie tego semafora, blokuje przebieg i semafor nie zostanie podany!
5. Z tego samego powodu pamiętajmy, żeby
wpisać również te izolacje, które dotyczą torów z którymi przebieg się tylko krzyżuje:
Dobra, myślę, że jeśli chodzi o podawanie danych to już wszystko. Przejdźmy do łączenia eventów.
Łączenie eventów z toramiAby w scenariuszu wjazdy były podawane dopiero wtedy, gdy zbliżamy się do semafora, albo żeby rogatki opuszczały się i podnosiły w odpowiednich momentach, konieczne jest połączenie eventów z "MaSzynowego kodu scenariuszowego" do kodu Lua. Pierwszym krokiem będzie przypisanie eventów do toru. Można to zrobić w dwojaki sposób, można przypisać event0, event1, event2 itd. do toru, bądź też wstawić odcinek izolowany (przypisanie isolated do toru). Aby to zrobić, należy w pliku z torami znaleźć tor np. 2 km przed semaforem wjazdowym i przypisać do niego event:
https://wiki.eu07.pl/index.php/Obiekt_node::track#Parametry_opcjonalneNo i dwie uwagi:
- "Po primo"
nazywamy eventy sensownie, tzn. nie piszemy np. "jskdkbvufidbsa", albo "489367", tylko np. "ps_wjazd_a" (zasady nazywania izolacji wyżej),
- "Po drugo"
warto tworzyć eventy dla każdej sytuacji, nawet jeśli nie będzie ona w danym scenariuszu wykorzystywana. Jednym z założeń kodu Lua jest to, aby każdy scenariusz zawierał jedynie plik *.lua i *.scn, przy czym w *.scn będą jedynie include'y do wszystkiego oraz połączenie do kodu Lua scenariusza, a w *.lua kod do obsługi scenariusza samej w sobie.
Terz druga część roboty, czyli kodowanie w Lua. Otwieramy nasz plik z kodem scenariusza (nie kernelem) i wpisujemy tam bezpośrednio polecenie
polaczEvent(nazwa, polecenia)
gdzie
eventy to lista poleceń Lua, która ma zostać wykonana. I tak na przykład, jeśli wpiszemy
polaczEvent("wjazd1", {{"podajPrzebieg", {"stacja1_a", "1", genOpoznienie("stacja1")}}, {"podajPrzebieg", {"stacja1_k", "b", genOpoznienie("stacja1")}}})
to po wywołaniu eventu "wjazd1" zostaną wykonane polecenia tak, jakby wywołać
podajPrzebieg("stacja1_a", "1", genOpoznienie("stacja1"))
podajPrzebieg("stacja1_k", "b", genOpoznienie("stacja1"))
Jeżeli chcemy sprawdzić izolację, jako pierwszy parametr do
polaczEvent wpisujemy
nazwa_izolacji:busy/free, czyli odpowiednio gdy dana izolacja zostanie zajęta lub zwolniona, np.
tor1:busy oznacza, że funkcje z listy zostaną wykonane, gdy izolacja
tor1 zostanie zajęta.
Co oznaczają konkretne polecenia i co można wpisać - o tym w następnej części.
Ciąg dalszy nigdy nie nastąpi...