Cessna 172 cockpit otthon

Építsünk szimulátort

FSUIPC SDK - Java API

2018. november 11. - C172Peti

Ahhoz, hogy a repszimből valahogy kinyerjük az adatokat szükségünk van valamiféle API-ra, amin keresztül hozzáférünk lehetőleg mindenhez. Az FSUIPC ad nekünk egy SDK-t is, amivel tudunk Microsoft Flight Simulator  verzióihoz (nekem konkrétan FSX SE van felrakva) és Prepar3d-hez kapcsolódni, onnan adatot kinyerni, módosítani .

Az SDK-ban jópár programozási nyelvhez találunk APIt. Pl VisualBasic, C, C#, .NET, Delphi, Python, Java.

A C és a Java API-kat néztem meg, a többiről nem nagyon tudok nyilatkozni. Mivel Java fejlesztésben van sok tapasztalatom, megpróbálok ezzel megvalósítani mindent. Azért azt meg kell említenem, hogy rengeteg időt fordítottam a C-re is. Van egy nagyon nagy előnye a C API-nak a Java-hoz  képest. Ez pedig nem más, hogyha Arduinóra akarunk adatot küldeni, akkor a C típusok gyakorlatilag megegyeznek az Arduino típusokkal. Ez nagyon leegyszerűsíti azt a folyamatot, amikor egy integer-t, byte-ot vagy long adatot akarunk az Arduinóra küldeni vagy onnan fogadni. Java esetében kicsit ügyeskedni kell, hogy megfelelően értelmezze mind a két oldal. 

Na de nézzük a Java API-t. A build path-ra rátesszük az fsuipc.jar-t és beállítjuk a native libraryt is hozzá (fsuipc_java.dll). A native library beállítása az alábbi képen, ez a project settings / Java Build path / Libraries fülön lesz. Itt a dll-t tartalmazó könyvtárat kell megadni.

project_settings.png

Ezek után nincs más dolgunk, mint a com.flightsim.fsuipc.fsuipc_wrapper osztályt importálni és ennek a statikus függvényeivel tudunk is dolgozni. Az összedobott kis programomban két függvényt használok.

public static synchronized native int Open(int arg0);

Kapcsolódás a szimulátorhoz. Egy paramétere van, amivel a szimulátor típusát adhatjuk meg.  Használjuk az fsuipc_wrapper.SIM_ANY konstanst és akkor bármihez tud csatlakozni, ami épp fut. Visszatérési értéke 0, ha sikertelen a csatlakozás. 

void ReadData(int arg0, int arg1, byte[] arg2);

Ezzel lehet kiolvasni egy adott címről valamit. A címet az arg0 helyén adjuk meg, arg1 lesz, hogy hány byte-ot akarunk, arg2 pedig a byte tömb, ahova bepakolja.

FSUIPC4 Offsets Status.pdf

A legjobb, ha már a legelején elkezdünk barátkozni az offset status doksival. Ez voltaképp egy jó nagy táblázat, ahol fel van sorolva minden cím, ott milyen adat található, milyen hosszon, és hogy mit csinálhatunk vele (olvashatjuk/írhatjuk). A programomban a flaps állapotjelzőjének az állását olvasom ki, ez a sor így néz ki a pdf-ben:

Offset Size Use FSX Read FSX Write
0BE0 4 Flaps position indicator (left). This gives the proportional amount, with 16383=full deflection. It doesn’t correspond to the equally spaced notches used for the control lever. If you know the maximum deflection angle you can derive the current angle by ((max *  position indicator) / 16383). This only gives the (inboard?) trailing edge flaps. Please see offsets 30E0–30FF for greater details where needed. Ok-SimC*
(see note)
No

 

Ebből látjuk, hogy ez egy 4 byte-os adat, értékkészlete 0-16383. Voltaképp 2 byte elég lenne a tárolásához, nem igazán értem miért van mégis 4-en. Mindenesetre ezen gyorsan túllépve a következő kérdés az, hogyan csináljak ebből egy használható számot. Erre tökéletes a java.nio.ByteBuffer, valahogy így:

ByteBuffer wrapped = ByteBuffer.wrap(inputData);

int tmpi = wrapped.getInt();

Egy érdekesség még van itt: ahhoz hogy a ByteBuffert használni tudjam az int készítéshez, meg kell fordítanom a szimulátortól kapott byte tömböt.

 A teljes java kódot innen tudod letölteni.

A működésről egy rövid videó:

 

A bejegyzés trackback címe:

https://repszim.blog.hu/api/trackback/id/tr2414359273

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.