Nie taki LUA straszny

FSUIPC to narzędzie o wielkich możliwościach. Do niedawna sądziłem, że tylko kawy nie umie przyrządzić. Jednak poszukując możliwości maksymalnego wykorzystania zainstalowanych joy’ów natrafiłem na granice jego możliwości. Z pewną taką nieśmiałością, zapuściłem się więc w zakamarki skryptów LUA.

Zastosowanie skryptów LUA w FSUIPC daje olbrzymie możliwości. Język programowania jest przystępny dla osób, które spotkały się już z C++, PHP czy dowolnym innym. Jednak nawet osoby bez doświadczenia będą w stanie wykonać proste skrypty. Tym bardziej, że do FSUIPC dołączono plik ZIP z przykładami. Tym, co powstrzymuje wielu użytkowników przed LUA, jest brak dobrego opisu sposobu powiązania FSUIPC ze skryptami. Na początek trzeba błądzić po omacku. Postaram się więc w tym artykule zapalić pierwszą latarnię.

Dla tych, którzy dotychczas nie próbowali grzebać w FSUIPC, proponuję lekturę artykułu z jednego z wcześniejszych wydań naszego czasopisma.

Problem do rozwiązania

Mam kilka wolnych suwaków (rozpoznawanych jako osie joysticka). Chciałbym je powiązać ustawianiem częstotliwości radia. Jedna oś służyłaby do ustawiania całości, druga do ułamków (rys. 1). Chcę przesunąć suwak raz, a częstotliwości mają przeskakiwać same. Gdy cofnę suwak – mają się zatrzymać.

Przesunięcie pierwszego suwaka w górę ma spowodować stopniowe zwiększanie całości (134 na rysunku), a jego cofnięcie do pozycji środkowej zatrzymanie zmiany. Przesunięcie w dół spowoduje zmniejszenie wartości. Jeśli nie masz wolnej osi, możesz to samo zrobić z użyciem przycisków. Na rys. 2 pokazano alternatywne rozwiązanie z przyciskami.

Przyciski [+] i [-] służą do zwiększania lub zmniejszania wartości częstotliwości. Przycisk [whole/frac] przestawia ich działanie z całości na setne i odwrotnie. Przycisk [swap] służy do zamiany ustawianej częstotliwości na aktywną.

Cała zabawa polega na tym, aby raz wcisnąć i czekać aż prawidłowa wartość się ustawi. Nie interesuje nas wielokrotne klikanie. Warto zauważyć, że rozwiązanie, które zaproponujemy jest uniwersalne – można je zastosować do dowolnej sytuacji znacznej zmiany wartości parametru, np.: ustawienie prędkości, kierunku, kursu, wysokości, szybkości wznoszenia, trymera itp.

Dlaczego FSUIPC nie da rady?

Właściwie to FSUIPC ma możliwość programowania funkcji samopowtarzania:

1=R<joy>,<przycisk>,<funkcja>,<parametr>

„R” oznacza „powtarzaj, gdy włączony” (inne opcje, które nas w tej chwili nie interesują, to P – „wykonaj raz, gdy włączany”, U – „wykonaj raz, gdy wyłączany”). Problem w tym, że częstotliwość tych powtórzeń jest stała, ok. 10 razy na sekundę (dokumentacja wspomina o 6x, ale w praktyce jest więcej). Ustawienie prawidłowej wartości częstotliwości przy tak dużym tempie zmian jest niemal niemożliwe. Komfortowe tempo to ok. 4 zmiany na sekundę.
W przypadku osi joysticka funkcja w fsuipc.ini wyglądałaby tak:

1=<joy><oś>,256
2=<joy><oś>,UR,<granica dolna>,<granica górna>, <funkcja1>,0
3=<joy><oś>,DR,<granica dolna>,<granica górna>, <funkcja2>,0

UR oznacza powtarzaj (R) przy przekroczeniu granicy w górę (U), a DR – w dół (D). To ograniczenie powoduje, że przesuwając suwak do góry wywołamy zmianę, ale cofając go już nie. Bez tego ograniczenia, cofnięcie suwaka spowodowałoby kolejną zmianę ustawianej wartości. Granica dolna i górna to po prostu zakres pracy suwaka, w którym dana funkcja ma być uruchamiana. W tym przypadku będą to górny i dolny koniec tego zakresu. Natomiast w środku pozostanie spora martwa strefa (nie chcemy przypadkowych zmian).

I znowu, jak w przypadku przycisku – częstotliwość zmian jest tak duża, że nie ma możliwości precyzyjnego ustawienia. Ratunkiem okazuje się LUA.

Programowanie z LUA

Wszystkie skrypty LUA powinny znajdować się w folderze Modules w FS (tym samym, w którym znajduje się plik fsuipc.ini). FSUIPC w momencie uruchomienia samoczynnie sprawdza katalog i dopisuje do fsuipc.ini odpowiednią linię:

[LuaFiles]
1=sleep_repeat

Jak łatwo się domyślić z powyższego wpisu, utworzyliśmy plik o nazwie sleep_repeat.lua.

To co niemożliwe dla FSUIPC, jest łatwe dla LUA. Dlatego plik będzie krótki, tylko dwie linie. Uwaga: LUA zwraca uwagę na wielkość liter!

ipc.control(ipcPARAM)
ipc.sleep(250)

Krótkie wyjaśnienie:

  • ipc.control(n) – wykonaj funkcję „n”. Funkcje te znaleźć można w plikach List of FS2004 controls oraz FSUIPC for Advanced Users. Zamiast „n” wpisać należy odpowiedni cztero- lub pięciocyfrowy kod.
  • ipc.sleep(250) – zatrzymaj wykonywanie przez 250 tysięcznych sekundy, czyli 4 wykonania na sekundę. Można zmieniać dowolnie.
  • ipcPARAM – zmienna przekazywana przez FSUIPC w momencie uruchamiania skryptu. W tym przypadku jako zmienną podamy odpowiedni numer funkcji.

Taki skrypt jest bardzo uniwersalny. Używając jednego skryptu możemy zaprogramować powtarzanie dla wszystkich interesujących nas przycisków i osi.

Wersja dla programowania osi. Teraz czas na zmiany w FSUIPC.ini. Zakładam, że skrypt został dopisany w sekcji [LuaFiles] pod pozycją 1 (jak powyżej). W takiej sytuacji, w sekcji [Axes.<nazwa samolotu>] (zakładam, że masz włączone profile w FSUIPC) dodajemy:

32=3Z,256
33=3Z,UR,13000,16383,L1:R,65637 ;com1 whole inc
34=3Z,DR,-16384,-13000,L1:R,65636 ;com1 whole dec

Wyjaśnienie:

  • linia 32 – definiujemy zakresy działania dla osi 3Z. Ta linia jest konieczna, choć nic nie robi.
  • linia 33 – oś 3Z, UR = powtarzaj przy przekroczeniu zakresu w górę, „13000,16383” – działaj tylko w końcówce górnego zakresu pracy suwaka (chcemy mieć dużą martwą strefę, aby uniknąć przypadkowych zmian, cały zakres pracy to od -16384 do 16383), „L1:R” – uruchom skrypt LUA z numerem 1, jako parametr (ipcPARAM) weź „65637”.
  • linia 34 – DR = powtarzaj przy przekroczeniu zakresu w dół, „-16384,-13000” – działaj w końcówce dolnego zakresu pracy suwaka.

Jak łatwo sprawdzić w pliku List of FS2004 controls, 65637 odpowiada za zwiększenie całości w COM1, a 65636, za ich zmniejszenie. Identycznie postępujemy dla setnych na drugim suwaku:

35=3V,256
36=3V,UR,12353,16383,L1:R,65639 ; com1 frac inc
37=3V,DR,-16384,-13000,L1:R,65638 ; com1 frac dec

Tempo powtarzania reguluje w tym przypadku nie FSUIPC, a LUA, zgodnie z ustawieniem w skrypcie. Dlatego fakt, że UR i DR są powtarzane 10x na sekundę nas nie interesuje.

Wersja dla programowania przycisków. Programowanie przycisków trzeba zacząć od wspomnianego wcześniej przełącznika [whole/frac]. Jeśli chcesz zaprogramować zmianę nie tylko COM1, ale również COM2, NAV1, NAV2, itp., to wystarczy jeden taki przełącznik.

1=P3,11,Cx510066C1,x00010001 ; whole/frac

  • P3,11 – joystick 3, przycisk 11 (uwaga! FSUIPC liczy urządzenia od 0, a Windows od 1, dlatego dla Windows będzie to joystick 4, przycisk 12).
  • Cx510066C1 – ustaw wartość offsetu z puli przeznaczonej dla użytkowników (od 66C1 do 66FF)
  • x0001 – liczba dopuszczalnych wartości offsetu, w tym przypadku 2 (tj.: 0 i 1)
  • 0001 – skok – o ile wartości przeskoczyć w momencie uruchomienia.

W ten sposób pod przyciskiem P3,11 programujemy dwupozycyjny przełącznik, którego wartość wykorzystana zostanie w kolejnych liniach kodu:

2=B66C1=1 R3,19,L1:R,65639 ; com1 frac inc
3=B66C1=0 R3,19,L1:R,65637 ; com1 whole inc
4=B66C1=1 R3,20,L1:R,65638 ; com1 frac dec
5=B66C1=0 R3,20,L1:R,65636 ; com1 whole dec

  • B66C1=1 oznacza „jeśli offset 66C1 ma wartość 1, to” – prosta funkcja if… then…
  • R3,19 – powtarzaj, gdy wciśnięty przycisk 3,19
  • L1:R – wykonaj skrypt LUA numer 1
  • 65639 – parametr do wykonania skryptu (ipcPARAM) – odpowiedni numer funkcji z pliku List of FS2004 controls

Linie 2 i 3 obsługują przycisk [+]. Potrzebne są dwie linie, po jednej dla każdej pozycji przełącznika [whole/frac]. Linie 4 i 5 obsługują przycisk [-].

Do zaprogramowania pozostał przycisk [swap]:

6=P3,12,C66372,0 ; frequency swap

Funkcja 66372 odpowiada za zamianę wartości programowanej i aktywnej częstotliwości COM1. Ten przycisk warto mieć na wolancie, blisko przycisku nadawania PTT.

Obsługa makr FSUIPC

Schody zaczynają się, gdy przełączanie funkcji musi się odbywać za pośrednictwem mouse macro. Niektóre modele płatne utrudniają nam w tym względzie życie. LUA umie uruchomić makro, ale wymaga podania jego nazwy. Jak łatwo zauważyć, FSUIPC pozwala na przekazywanie do LUA tylko parametrów liczbowych. Jest jednak rozwiązanie, które przy okazji pozwoli lepiej zapoznać się z zasadą działania skryptów.

W FSUIPC jako parametry ustawiamy kolejne liczby 1, 2, 3…, na przykład zmodyfikujemy wcześniejszy przykład:

2=B66C1=1 R3,19,L1:R,1 ; com1 frac inc

Teraz trzeba nauczyć skrypt LUA, aby odpowiednio reagował na parametry (pamiętajcie o dużych/małych literach!):

if ipcPARAM == 1 then
-- COM1 WHO INC - to jest tylko linia komentarza
ipc.macro(„A320:com1_who_inc”)
elseif ipcPARAM == 2 then
-- COM1 WHO DEC
ipc.macro(„A320:com1_who_dec”)
else
-- podano nieprawidłowy parametr
ipc.display(„ERROR: Wrong parameter”)
ipc.sleep(2000)
end
ipc.sleep(250)

Jeśli wartość ipcPARAM wyniesie 1, to skrypt wykona pierwsze z makr: A320:com1_who_inc. A320 to w tym przypadku nazwa pliku (A320.mcro), a com1_who_inc, to nazwa makra (trzeba podać nazwę, a nie jego numer; inaczej niż to robimy w FSUIPC.ini). Dla każdej programowanej funkcji trzeba przygotować oddzielny zestaw linii. W ostatniej linii podać należy opóźnienie – ipc.sleep(250).

Dodatkowo w części zaczynającej się od „else” zaprogramowano informację o błędzie, która pokaże się na ekranie FS, gdy przekazany zostanie niewłaściwy parametr.

Co jeszcze można zrobić z LUA?

Możliwości wykorzystania skryptów LUA, szczególnie wraz z offsetami opisanymi w SDK dostępnym dla FSUIPC (do pobrania ze strony P. Dowsona), jest bez liku. Dysponując chwilą czasu można mieć świetną zabawę z programowania różnych, niedostępnych na pozór funkcji.

Najprostsze na początek to choćby:

  • ustawienie dowolnego trymera na dowolnej osi joysticka – zwykle jest to niemożliwe, gdy oś posiada sprężynę,
  • blokowanie wysuwania klap czy podwozia, gdy przekroczona jest dopuszczalna prędkość.

Można pójść dalej i zaprogramować skrypty uruchamiane automatycznie, które będą obsługiwały awarie w sytuacji nieprawidłowej obsługi maszyny, np.:

  • awaria klap przy próbie wysunięcia na zbyt dużej prędkości,
  • awaria podwozia przy zbyt dużej prędkości,
  • awaria silnika przy zbyt długim czasie pracy z maksymalną mocą.
  • Inna opcja, skoro już wspomniałem o skryptach inicjowanych automatycznie, to wirtualny drugi pilot, który może:
  • włączać światła TAXI, gdy maszyna jest w ruchu,
  • włączać światła LAND przy starcie,
  • chować podwozie po osiągnięciu określonej wysokości AGL,
  • chować klapy przy określonej prędkości,
  • wyłączać światła po przekroczeniu FL100, itp.

To wszystko można stosunkowo łatwo zaprogramować za pomocą skryptów LUA. Wszystkie parametry można z pomocą offsetów bardzo łatwo wyciągnąć z FS. Dzięki temu pilot może skupić się na kwestii najważniejszej – przygotowaniu i piciu kawy.  (SW)