Symulator EU07 (i nie tylko) > Na warsztacie

 Projekt Lua, czyli automatyzacja scenerii

(1/2) > >>

jakubg1:
Cześć. Jakieś kilka miesięcy temu rozpocząłem z ciekawości (i namowy innych osób) pisanie scenariuszy w języku Lua. Lubię kodować, więc takie rozwiązanie przypadło mi do gustu. I zrobiłem taki mały scenariusz - td_mijanka.scn. Jest to przerobiony w niewielkim stopniu Tor Doświadczalny z małym scenariuszem - mijanką pociągu osobowego z towarowym.
Kod podzielony jest na dwie części, jedną - kernel - która zawiera kod do przetwarzania informacji oraz wysyłania ich w odpowiedniej formie do symulatora - oraz drugą - kod scenariusza - zawierającą dane o stacjach, przebiegach oraz eventach zależnych od trasy.
Funkcje, które do tej pory zrobiłem:

* Dynamicznie generowane sygnały semaforów
* Przebiegi
* Obsługa odcinków izolowanych
* Losowanie opóźnienia dyżurnego dla każdej stacji oddzielnie, być może będziemy czekali na wjazd, a być może będzie już podany
* Własna kolejka eventów z możliwością ich odwołaniaDo perfekcji brakuje jeszcze dużo, dużo rzeczy i zdaję sobie sprawę z tego, iż ogarnięcie tego nie jest proste. Docelowo też obsługa tego systemu będzie wspierana w moim generatorze scenerii, w którym zrobię nową scenerię testową, żebym mógł przetestować więcej aspektów (jej schemat naskrobałem w załączniku).

Trzy uwagi na koniec:

* Warunkiem poprawnego działania scenerii jest posiadanie buildu EXE Miłka, buildy tmj nie obsługują kodu Lua.
* Wszelkie błędy typu crashe, zapalenia semafora za pociągiem, przerżnięcia S1 itd. proszę zgłaszać tutaj, załączając log.txt oraz screenshot, w przeciwnym wypadku nie będę takich zgłoszeń rozpatrywał!
* W kodzie jest dużo komentarzy, jeśli ktoś lubi może sobie przejrzeć, choć chyba nikt niczego tam nie zrozumie. :P
Linki do nowych wersji (wypakować do głównego katalogu symulatora):
Wersja 5.0: https://eu07.pl/userfiles/22592/lua_5_0_test1.zip

Linki do starych wersji (wypakować do scenery/):
Wersja 4.0: http://eu07.pl/userfiles/22592/priv-td_mijanka_8.7z
Wersja 3.1: http://eu07.pl/userfiles/22592/priv-td_mijanka_7.7z
Wersja 3.0: http://eu07.pl/userfiles/22592/priv-td_mijanka_6.7z
Wersja 2.0: http://eu07.pl/userfiles/22592/priv-td_mijanka_5.7z
Wersja 1.0: http://eu07.pl/userfiles/22592/priv-td_mijanka_3.7z

pozdze:

--- Cytat: jakubg1 w 31 Stycznia 2018, 18:39:23 ---
* Warunkiem poprawnego działania scenerii jest posiadanie buildu EXE Miłka, buildy tmj nie obsługują kodu Lua.
--- Koniec cytatu ---

Objaśnij o co chodzi. Co to są builidy?

uetam:
Kompilacje exe.

jakubg1:
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ę

--- Kod: ---config joinduplicatedevents yes endconfig

--- Koniec kodu ---
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ą

--- Kod: ---local kernel = require "scenery/$lua_test/kernel"

--- Koniec kodu ---
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

--- Kod: ---inicjalizuj()

--- Koniec kodu ---
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.

--- Kod: ---nazwy (array)
    parametr1 (string)
    parametr2 (array)
        parametr11 (int)
        parametr12 (string)
dupa (bool)

--- Koniec kodu ---
powinniśmy zapisać jako

--- Kod: ---{parametr1, {parametr11, parametr12}}, dupa

--- Koniec kodu ---
, oczywiście podstawiając, np. taki zapis jest poprawny:

--- Kod: ---{"Stacja1", {0, "Hahahaha"}}, false

--- Koniec kodu ---
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

--- Kod: ---nazwaObiektu

--- Koniec kodu ---
, jeśli zaś chcemy odwołać się do np. szlaku to wpisujemy

--- Kod: ---skrótStacji_nazwaObiektu

--- Koniec kodu ---
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 torami
Aby 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_opcjonalne
No 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

--- Kod: ---polaczEvent(nazwa, polecenia)

--- Koniec kodu ---
gdzie eventy to lista poleceń Lua, która ma zostać wykonana. I tak na przykład, jeśli wpiszemy

--- Kod: ---polaczEvent("wjazd1", {{"podajPrzebieg", {"stacja1_a", "1", genOpoznienie("stacja1")}}, {"podajPrzebieg", {"stacja1_k", "b", genOpoznienie("stacja1")}}})

--- Koniec kodu ---
to po wywołaniu eventu "wjazd1" zostaną wykonane polecenia tak, jakby wywołać

--- Kod: ---podajPrzebieg("stacja1_a", "1", genOpoznienie("stacja1"))
podajPrzebieg("stacja1_k", "b", genOpoznienie("stacja1"))

--- Koniec kodu ---
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...

Mariusz1970:
Szkoda, ze raczej nie ogarniasz zwyklych eventow, gdyz chcialbym zobaczyc porownanie w scenerii miedzy eventami a lua, robiace dokladnie to samo. Z lua tez to sa poczatki znajomosci z tematem.

Nawigacja

[0] Indeks wiadomości

[#] Następna strona

Idź do wersji pełnej
Powered by Advanced Topic Prefix Pro
Powered by SMFPacks Likes Pro Mod