Einführung von Joe Herwig

Vorwort

Die in dieser Kurzeinführung aufgenommenen Beispiele beziehen sich auf die am 2022-02-13 aktuelle Experimental Version des FlyByWire A32nx. Sie dürften aber in weiten Teilen auch in der aktuellen DEV-Version funktionieren.

Somit sind z. B. Offsets, Variablen, Events etc. auf dieses Flugzeug bezogen. Die grundsätzliche Funktionalität und Herangehensweise ist jedoch auf die im Januar 2022 aktuellen Versionen von MSFS, FSUIPC, LINDA, A32nx-LINDA-aircraft-module usw. bezogen.

Da es weder sinnvoll ist, Dokumentation zu duplizieren, bitte ich euch, erst mal in die Dokumentation der genutzten Anwendungen zu schauen. Alle Anwendungen haben gute Dokumentation oder sind recht intuitiv, so dass eine Abschreiben der Anleitungen hier einfach keinen Sinn ergibt.

Bitte nehmt es mir nicht übel, dass ich durchaus auch englischsprachige Dokumentation verlinkt habe. Dabei handelt es sich zumeist um die original Dokumentation und damit um "die Wahrheit" ;-)
Nicht immer ist diese in gutem Deutsch erhältlich. Wer tiefer in die Materie einsteigen möchte, kommt ohnehin um ein Mindestmaß an englisch Kentnissen nicht umhin, da in der Programmierung englisch einfach der Standard ist.

Bitte habt auch auf dem Schirm, dass sich die verlinkten Websites, Tools etc. permanent und super schnell weiter entwickeln.
Sollte also mal was nicht 1:1 zu dem passen, wie es sich euch darstellt, versucht bitte erst die Systematik dahinter zu verstehen, bevor ihr auf mich zukommt, weil ein "Button" auf einmal rechts statt links, oder grün statt orange ist. Danke!

Inhaltsverzeichnis

Download & Installation

Welche Addon Tools könnten sinnvoll sein?

FSUIPC

Download von http://www.fsuipc.com/
Registrierte Version empfohlen aber sicher nicht für jeden Notwendig.
Links zu Shops auf der o. g. Seite.

FSUIPC Websockets Server

bei FSUIPC mitgeliefert - ist ein geniales Tool, um unkompliziert eigene Projekte umzusetzen.

Beispielsweise Gauges, die auf jedem aktuellen Webbrowser ohne Performance-Einbußen laufen wie z. B. Portable Sim Panels

Oder auch ein Arduino-Projekt das sich per Wifi mit dem Netzwerk verbindet, und z. B. Korry-Switches im Overhead oder bis zu 128 Annunciators versorgt.

LINDA

Download von https://www.avsim.com/forums/forum/427-linda-downloads/
Sehr hilfreich bei VRinsight MCP Panels.
Erleichtert das Zuordnen von Tasten und encodern allerdings ohne Analogachsen!
Da LINDA donationware ist, empfiehlt sich für zufriedene Nutzer die Spende über den in der Software enthaltenen "PayPal donate" Button. Das ermöglicht die Weiterentwicklung.

Tip!

Wird im LINDA-Eigenen Editor auf einen Funktionsnamen mit der rechten Maustaste geklickt, wird die Funktion direkt ausgeführt, ohne dass sie irgendwo zugewiesen werden muss. Das kann gerade beim Schreiben von LINDA Modules und dem Testen der Funktionen sehr hilfreich sein.

Vorbereitende Konfiguration

gibt zusätzliche Configurationen, die sich für mich als sinnvoll erwiesen haben:

FSUIPC7.ini

EventFiles

[EventFiles]
0=A32nx
1= A32X-FBW1
2=A32X-FBW2

der die entsprechenden Mobiflight Event Files im FSUIPC root folder - also da wo auch die FSUIPC7.ini liegt - für LINDA verfügbar macht. Erfolgt das nicht, funktionieren in LINDA die ganzen Features nicht, die auf HVars zugreifen müssen.

Mitgeliefert werden die verschiedenen Event-Files von FSUIPC im \EventFiles Unterordner.

WAPI

[WAPI]
EnableWAPI=Yes

ist notwendig, damit FSUIPC7 sich mit dem WASM im MSFS verbinden und die LVars / HVars abrufen und aktualisieren kann.

FSUIPC_WAPI ist eine clientseitige API-Bibliothek für die Kommunikation mit dem FSUIPC-WASM-Modul. Sie ermöglicht den Abruf/die Auflistung von lbars/hvars, die Einstellung von lvars und die Aktivierung von hvars.

Mapping von Profilen und Presets auf das Flugzeug statt die livery

Seit FSUIPC v7.2.15 gibt es gem. Release-Notes einen Parameter der in der FSUIPC.ini eingefügt werden kann, und dann

Neuer Ini-Parameter hinzugefügt, der im Abschnitt [General] verwendet werden kann:
UseAirLocForProfiles=Yes

Dies ermöglicht die Profilanpassung anhand des aircraft.cfg-Ordners, was die Profilanpassung bei der Verwendung verschiedener liveries verbessern kann

WASM wurde auf 0.5.6 aktualisiert: Änderungen sind:- neuer Ini-Parameter UseAirLocForHvars hinzugefügt, um den Abgleich von Hvar-Dateien anhand des Namens des Air-File-Ordners zu ermöglichen

Diesen im

[GENERAL]

als

UseAirLocForProfiles=Yeshinzufügen. Das sorgt in aktuelleren FSUIPC Versionen dafür, dass anstelle des Aircraft Substrings aus dem Title der aircraft.cfg die Referenz auf das Airfile genommen wird.
Siehe: https://forum.simflight.com/topic/93496-for-every-liverie-a-new-profile/

Natürlich geht es auch ohne, allerdings kann es dann verstärkt dazu führen, dass man sich mit der "0 Hvars found" Problematik auseinander setzen muss.

FSUIPC_WASM.ini

unter....\Community\fsuipc-lvar-module\FSUIPC_WASM.ini bekam

LvarScanDelay=60

hinzugefügt.

Die Erhöhung von 5 auf 60 Sekunden kann dabei helfen, wenn ein Teil der Variablen funktioniert, ein anderer Teil jedoch nicht. Dann ist ggf. einfach nur zum Zeitpunkt der Variablensynchronisation noch nicht alles initialisiert gewesen.

UseAirLocForHvars=Yes

Siehe auch FSUIPC.ini

Variablen, Events, Offsets und mehr...

Die Variablentypen

des MSFS

in der Microsoft SDK Dokumentation
Variablen Prefix System Name Beschreibung Einheiten
A Simulation Variable Ruft eine angegebene SimVar aus einem Simulationsobjekt ab. Ja
B Input Events Ruft den Wert des angegebenen Eingabeereignisses ab (weitere Informationen findet ihr unterDefinitionen von Eingabeereignissen ). Nein
C Callback Variables Dieses Variablenpräfix wird nur bei GPS-Variablen verwendet. Ja
E Environment Variable Dies ist eine Umgebungsvariable. Siehe den Abschnitt über Environment Variables. Ja
F Function Library Dies bezeichnet eine eingebaute Funktion aus der Funktionsbibliothek. Siehe den Function Library Absatz für weitere Details. Nein
G Gauge Variables Ruft eine Variable ab, die zur Übertragung von Daten ohne Einheiten zwischen Gauges (Anzeigeinstrumenten) verwendet werden kann. Nein
H HTML Event Ein HTML-Ereignis, das an das JavaScript gesendet wird. Diese werden in den Model Behaviorsdes Cockpit-Panels definiert und gehen nur in eine Richtung: vom Panel zum JavaScript/HTML-Code. H:-Events müssen nicht im Voraus definiert werden (ähnlich wie L: -Vars) und können mit einer beliebigen zusammenhängenden Folge von alphanumerischen Zeichen benannt werden. Jedes Cockpit-Panel im Microsoft Flight Simulator sendet eine Reihe von cockpitspezifischen H: -Events, für die es kein analoges Tastenereignis gibt, wie z. B. das Drücken einzelner Tasten auf einem FMS-Computer. Diese individuellen panel-spezifischen Ereignisse können von JavaScript-Instrumenten empfangen werden. Nein
I Instrument Variable Wird für Variablen innerhalb von Komponenten verwendet, wobei der Geltungsbereich der Variablen und seine untergeordneten Kindelemente sind. Nein
K Key Event ID Dies ist eine spezifische Variable für eine Event ID für Benutzereingaben.

(>K:TOGGLE_ICS)

Beachten Sie, dass bei einigen Schlüsselereignissen ein oder mehrere Werte gesendet werden müssen. Weitere Informationen hierzu findet Ihr im Abschnitt SimVars And Keys.

Nein
L Local Variable

Ruft eine benutzerdefinierte lokale Variable ab und/oder erstellt sie. Wenn die lokale Variable nicht in einer der zugehörigen Dateien definiert wurde, wird sie erstellt und beim ersten Verweis auf 0 gesetzt (und bleibt zwischen den Durchläufen nicht bestehen). Sie können jedoch mit Hilfe der folgenden Dateien einen Standardwert für lokale Variablen definieren:

Diese variable kann gelesenund im Bereich des Benutzerflugzeugs beschrieben (gesetzt) sowie von AI Aircraft gelesen werden.

Wichtig! "L:" vars können Ausschließlich numerische Daten und nichts anderes enthalten. Z. B. keine Strings (Zeichenketten), keine Binärwerte, keine Strukturen usw...

Nein
M Mouse Variable Ermittelt den Zustand der Maus zur Verwendung in Mausklick-Handlern. Bitte beachten Sie den Mouse Variables Abschnitt Nein
O Component Variable Wird für Variablen innerhalb von Komponenten verwendet, wobei der Scope die Komponente selbst ist. Nein
P Program Variable Identisch zur Environment Variable (Umgebungsvariable) E: Ja
R Resource Variable Dies wird verwendet, um einen Wert aus einer externen Ressource abzurufen, die entweder eine legacy -Hilfe-ID oder eine Tooltip-ID oder etwas aus einer benutzerdefinierten Lokalisierungsdatei sein kann. Siehe Resource Variables für weitere Details.  
X Calculator Variable / CalculatorCode TDiese Variable wird ausschließlich bei der Erstellung von Mission Definitions verwendet und dient zur Referenzierung von Parametern, die im <CalculatorParameterList> -Element innerhalb einer RPN-Berechnung (innerhalb einer <CalculatorFormula>) erstellt wurden. Nein
W Wwise (Audio) Event Dies ist eine Wwise-Ereignis-ID und ermöglicht es Ihnen, ein Wwise-Ereignis auf der Grundlage einer von der XML-Datei gesteuerten Logik auszulösen. Dies macht sie flexibler als die in sound.cfg definierten Sounds und die AnimSoundEvents, obwohl sie komplexer zu verwenden sind. Nein
Z Custom SimVar Dies sind benutzerdefinierte Variablen, die in der Simulation eines Objekts gespeichert werden. Der Variablenname ist nicht im Code der Microsoft Flight Simulator -Engine vordefiniert, so dass jeder eine Variable mit dem gewünschten Namen erstellen kann, solange sie nicht mit einer bestehenden SimVar kollidiert. Nein

FSUIPC Presets

Ein FSUIPC Preset ist ein Name, der einem - auch parametrisierbaren - Calculator Code zugewiesen wird. Calculator Code-Presets werden dem FSUIPC7 durch zwei Dateien bekannt gemacht, die sich im Stammverzeichnis des FSUIPC7 befinden müssen. Das Format dieser Dateien ist identisch und sie müssen die Namen events.txt oder myevents.txt haben.

Es müssen nicht beide Dateien verwendet werden, aber beide werden geladen, wenn sie vorhanden sind. Sind sie nicht vorhanden, ist es für die weiterne Funktionen von FSUIPC unerheblich.

Da mit jedem Flieger und jedem Release neue Presets hinzugefügt werden, kann nahezu täglich eine neue Version der events.txt von Mobiflight HubHop heruntergeladen[1] werden.

A320_Neo_CDU_2_BTN_X#(>H:A320_Neo_CDU_2_BTN_X)
A320_Neo_CDU_2_BTN_Y#(>H:A320_Neo_CDU_2_BTN_Y)
A320_Neo_CDU_2_BTN_Z#(>H:A320_Neo_CDU_2_BTN_Z)
A32NX_ADIRS_KNOB_1_ATT#2 (>L:A32NX_OVHD_ADIRS_IR_1_MODE_SELECTOR_KNOB)
A32NX_ADIRS_KNOB_1_NAV#1 (>L:A32NX_OVHD_ADIRS_IR_1_MODE_SELECTOR_KNOB)
A32NX_ADIRS_KNOB_1_OFF#0 (>L:A32NX_OVHD_ADIRS_IR_1_MODE_SELECTOR_KNOB)
TCAS_SWITCH_POSITION_STBY#0 (>L:A32NX_SWITCH_TCAS_Position)
TCAS_SWITCH_POSITION_TA#1 (>L:A32NX_SWITCH_TCAS_Position)
TCAS_SWITCH_POSITION_TA_RA#2 (>L:A32NX_SWITCH_TCAS_Position)
//Fly By Wire/A320/Passengers/Crew
A32NX_CALLS_EMER_ON_OFF#0 (>L:A32NX_CALLS_EMER_ON)
A32NX_CALLS_EMER_ON_ON#1 (>L:A32NX_CALLS_EMER_ON)
A32NX_EVAC_CAPT_TOGGLE_CAPT#0 (>L:A32NX_EVAC_CAPT_TOGGLE)
A32NX_EVAC_COMMAND_TOGGLE_OFF#0 (>L:A32NX_EVAC_COMMAND_TOGGLE)
A32NX_EVAC_COMMAND_TOGGLE_ON#1 (>L:A32NX_EVAC_COMMAND_TOGGLE)
NO_SMOKING_AUTO#(L:XMLVAR_SWITCH_OVHD_INTLT_NOSMOKING_Position) 1 == is{1 if{(>L:XMLVAR_SWITCH_OVHD_INTLT_NOSMOKING_Position) 1 (>L:XMLVAR_SWITCH_OVHD_INTLT_NOSMOKING_Position) } } els} (L:XMLVAR_SWITCH_OVHD_INTLT_NOSMOKING_Position) 1 ==if{ 1 if{ 1 (>L:XMLVAR_SWITCH_OVHD_INTLT_NOSMOKING_Position) 1 (>L:XMLVAR_SWITCH_OVHD_INTLT_NOSMOKING_Position) } }
NO_SMOKING_OFF#(L:XMLVAR_SWITCH_OVHD_INTLT_NOSMOKING_Position) 0 == is{1 if{(>L:XMLVAR_SWITCH_OVHD_INTLT_NOSMOKING_Position) 1 (>L:XMLVAR_SWITCH_OVHD_INTLT_NOSMOKING_Position) } } els} (L:XMLVAR_SWITCH_OVHD_INTLT_NOSMOKING_Position) 1 ==if{ 1 if{ 2 (>L:XMLVAR_SWITCH_OVHD_INTLT_NOSMOKING_Position) 2 (>L:XMLVAR_SWITCH_OVHD_INTLT_NOSMOKING_Position) } } }
NO_SMOKING_ON#(L:XMLVAR_SWITCH_OVHD_INTLT_NOSMOKING_Position) 2 == is{1 if{(>L:XMLVAR_SWITCH_OVHD_INTLT_NOSMOKING_Position) 1 (>L:XMLVAR_SWITCH_OVHD_INTLT_NOSMOKING_Position) } } els} (L:XMLVAR_SWITCH_OVHD_INTLT_NOSMOKING_Position) 1 ==if{ 1 if{ 0 (>L:XMLVAR_SWITCH_OVHD_INTLT_NOSMOKING_Position) 0 (>L:XMLVAR_SWITCH_OVHD_INTLT_NOSMOKING_Position) } } }
PUSH_OVHD_CALLS_AFT_OFF#0 (>L:PUSH_OVHD_CALLS_AFT)
PUSH_OVHD_CALLS_AFT_ON#1 (>L:PUSH_OVHD_CALLS_AFT)
PUSH_OVHD_CALLS_ALL_OFF#0 (>L:PUSH_OVHD_CALLS_ALL)

In FSUIPC werden die Presets leider über einfache Drop-Down Felder. John Dowson von FSUIPC empfiehlt[*] aufgrund der suboptimalen Auswahlmöglichkeit nur die Presets der wirklich geflogenen Flieger aus der heruntergeladenen events.txt in die myevents.txt zu übernehmen.

Natürlich können dort auch selbst ermittelte Einträge von euch eingefügt werden. Allerdings sollte dann die events.txt im FSUIPC Installationspfad so umbenannt werden, dass sie einen anderen Namen erhält.

So z. B. nach events.orig.

FSUIPC Offsets

Zu den FSUIPC Offsets gibt es mit FSUIPC eine sehr umfangreiche Dokumentation. Diese hier wiederzugeben ergibt keinen Sinn. Bitte schaut einfach in eurem Dokumentationsordner von FSUIPC nach.

Woher bekomme ich die?

aus dem Simulator

DevTools

die für uns zumeist interessanten Variablen werden in der

..._INTERIOR.XML
eines jeden Flugzeugs geführt. Die anderen XML sind oftmals von Bodengeräten, GSX etc. und für uns zumeist weniger Interessant. Bitte drauf achten. Hier ist oft initial die für uns falsche XML vorausgewählt.

aus der Dokumentation

z. B.

Microsoft Doku

https://docs.flightsimulator.com/

FlyByWire Doku

https://docs.flybywiresim.com/pilots-corner/a32nx-briefing/a32nx_api/

Mobiflight HubHop

https://hubhop.mobiflight.com/presets/

John Dowson - Entwickler von FSUIPC - empfiehlt die events.txt als events.orig abzuspeichern und nur für die wirklich geflogenen Flugzeuge die Abschnitte in die myevents.txt raus zu kopieren.

FSUIPC Controls List

Controls List for MSFS Build 999.txt
in der mitgelieferten FSUIPC Doku

aus Tools

FSUIPC

FSUIPC WebSockets Server

Nachdem der Server mit dem MSFS verbunden ist, kann auf der Seite MSFS Variables über die Buttons "Log LVars" und "Log HVars" die Liste der aktuell verfügbaren - damit auch der zum derzeit geladenen Flugzeug passenden - Variablen im "WASM Module Log" Fenster darunter aufgelistet werden.

Dort lassen Sie sich durch

  1. [Click] auf den ersten, und [Shift]+[LeftClick] auf den letzten Eintrag alle Markieren und per
  2. [STRG]+[C] heraus kopieren. Nun können Sie z. B. im Texteditor in eine neue Datei eingefügt und darin einfach gesucht werden.

Weitere Dokumentation und Beispiele sich mit diesem zu verbinden, findet ihr unter http://fsuipcwebsockets.paulhenty.com/#jsconnection

SimVarWatcher

Ist eine SDK-Demo-Anwendung die u. a. dafür genutzt werden kann, die aktuell verfügbaren LVars raus zu ziehen.

Download bei der Microsoft SDK Doku.

Die Verwendung der Variablen & Events

Assignments in FSUIPC

Achsen

klassische Achsen für Aileron, Pitch, Rudder, Thrust etc. Siehe FSUIPC Doku.

Thrust & Reverser auf einer Achse (1)

Axis assignments
Axis selection and function assignment
  1. Ist noch keine oder die falsche Joystick-Achse in (2) gewählt, noch mal auf "Rescan" klicken und die gewünschte Achse bewegen.
  2. Wenn unter Joy# und Axis# die gewünschte Achse erscheint
  3. auf "Send direct to FSUIPC Calibration"
  4. die gewünschte Funktion auswählen
Axis selection and function assignment
  1. Auf die Seite mit den Einstellungen für die gerade zugewiesene Funktion gehen (hier: Throttle 1)
  2. Den Thrust-lever ganz zurück auf die Minimum-Position (Full Reverse) ziehen und (2) Set klicken
  3. Den Thrust-lever ganz vor auf die Maximum-Position (TOGA) schieben und (3) Set klicken
  4. Den Thrust-lever auf die Idle-Position legen und (4) Set klicken

Jetzt kann in der linken Anzeige bei "Out" der Wert geprüft werden. Idle sollte 0 ausgeben, während Full Thrust16383 und Full Reverse -16384 ausgibt.

Ggf. - wie im FBW A32nx - müssen noch im Addon die Positionen des Schubhebels "eingelernt" werden. Oftmals erfolgt dies über eine Einstellungsseite im FlyPad.

Thrust & Reverser auf einer Achse (2)

Ggf. kann es notwendig sein, für Thrust und Reverser zwei "Kanäle" auf eine Joystick-Achse zu legen. Im Folgenden wird beschrieben, wie sich dies gut mit FSUIPC lösen lässt.

Axis assignments
Axis selection and function assignment Throttle + Reverser
  1. Ist noch keine oder die falsche Joystick-Achse in (2) gewählt, noch mal auf "Rescan" klicken und die gewünschte Achse bewegen.
  2. Wenn unter Joy# und Axis# die gewünschte Achse erscheint
  3. auf "Send direct to FSUIPC Calibration"
  4. Auswahl freischalten
  5. die gewünschte Funktion für Throttle auswählen
  6. Auswahl freischalten
  7. die gewünschte Funktion für Reverser auswählen
Axis selection and function assignment
  1. Auf die Seite mit den Einstellungen für die gerade zugewiesene Thrust-Funktion gehen (hier: Throttle 1)
  2. Den Haken bei "No Reverse Zone" setzen
  3. Den Thrust-lever auf die Idle-Position legen und (3) Set klicken
  4. Den Thrust-lever ganz vor auf die Maximum-Position (TOGA) schieben und (4) Set klicken

Jetzt kann in der linken Anzeige bei "Out" der Wert geprüft werden. Idle und alles im Reverser-Bereich sollte 0 ausgeben, während Full Thrust 16383 ausgibt.

reverser calibration
  1. Auf die Seite mit den Einstellungen für die gerade zugewiesene Reverser-Funktion gehen (hier: Reverser 1)

    Sicherstellen, dass der angezeigte Wert in der roten Box etwas niedriger ist, als der Idle Wert aus vorigem Schritt (3)

  2. dann auf Set (2) klicken
  3. Schubhebel auf max reverse (ganz zurück) ziehen und Set (3) klicken.
  4. Jetzt überprüfen, ob die Werte für die Achsen korrekt zugewiesen sind.
  5. Jetzt kann in der linken Anzeige bei "Out" der Wert geprüft werden. Idle und alles im forward thrust Bereich sollte 0 ausgeben, während Full Reverse -4096 ausgibt.

Thrust & Reverser auf einer Achse (3)

Ggf. kann es notwendig sein auf einer Achse Analogfunktion und eine Tastfunktion zu nutzen.

Beispielsweise für

Auch das ist wie folgt möglich

Axis + REV-Button
  1. Achse bewegen um sie auszuwählen
  2. Prüfen, ob die Achse korrekt erkannt wurde
  3. für den Analog-Part die Achse auf "Send direct to FSUIPC Calibration" gehen
  4. Auswahl aktivieren
  5. Funktion für Analogweg wählen
  6. den Schwellwert (hier den oberen da wir uns für reverser nach unten bewegen) von der gewünschten Achsenposition nehmen und auf "To" klicken
  7. den unteren Grenzwert des Bereichs mit der Achse einstellen und auf "From" klicken
  8. ggf. "Presets" aktivieren
  9. Checkbox für die Funktionsauswahl aktivieren
  10. und die Funktion hinterlegen die getriggert werden soll, wenn die Achse in den zuvor definierten Bereich gefahren wird.
    Mittels der Checkboxen für "Up" und "Down" kann definiert werden, wenn z. B. dies die mittlere von drei Bereichen ist, ob nur beim Hochweg, beim Runterweg oder in beide Richtungen die Funktion aktiviert werden soll.
calibration 3
  1. Bei der Kalibrierung der Throttle-Achse ist nun darauf zu achten, dass deren "Min-Wert" etwas größer als der größere der Schwellwerte aus voriger Bereichszuordnung ist. Daher die Achse noch etwas aus der Reverser-Zone in den Idle-Bereich schieben.
    Andernfalls kommen sich Throttle und Reverser ins Gehege.
  2. den Min-Bereich der Achse mit klick auf Set (2) speichern
  3. Die Achse auf TOGA schieben und den Max-Bereich der Achse mit klick auf Set (3) speichern
  4. Mit OK abschließen.
Bitte dran denken, dass wenn ihr sowas z. B. für den Nachbrenner macht, die Schwellwerte in die andere Richtung zu definieren sind.

Poti als Drehschalter

Ich nutze es z. B. für ADIRS, Engine Mode Selector, Scheibenwischer-Schalter oder in GA-Aircraft für den Magnetschalter (Mags).A320 ADIR SwitchesA320 ENG-Mode_Switch

Auch das ist möglich. Hier gezeigt am Beispiel des ADIR 1

Axis + REV-Button

Achse bewegen um sie auszuwählen und Prüfen, ob die Achse korrekt erkannt wurde

  1. Poti nach ganz links drehen (min-Wert) und auf "From" (1) klicken
  2. Poti dorthin drehen, wo von "OFF" auf "NAV" gewechselt werden soll und auf "To" (2) klicken
  3. "Select for Preset" wählen
  4. die beim einfahren in den unter (1) und (2) definierten Wertebereich zu aktivierende Funktion wählen.
    Mittels der Checkboxen für "Up" und "Down" kann definiert werden, wenn z. B. dies die mittlere von drei Bereichen ist, ob nur beim Hochweg, beim Runterweg oder in beide Richtungen die Funktion aktiviert werden soll.
Axis + REV-Button 2nd Zone
  1. Poti NICHT drehen, aber die nächste Zone (2) wählen
  2. Wenn die benachbarte Zone ausgewählt ist, in den From-Bereich den Wert übernehmen mindestens dem zuvor hinterlegten "To" Wert entspricht. Es darf auch eine Lücke zwischen den Bereichen sein, eine Überschneidung ist zumeist sinnfrei und eher problematisch.
  3. das obere Ende des Bereichs mit dem Poti einstellen und auf "To" (4) klicken.
  4. Preset/Funktion auswählen

und ggf. mit den weiteren Bereichen und Presets / Funktionen so fortfahren.

FSUIPC Presets

Aufgrund meiner Anfrage an die Dowsons die Caluclator-Codes zuzuweisen und dies zunächst per LUA-Script und Offsets recht komplex aber funktionierend bereitzustellen, hatte John die Möglichkeit implementiert, direkt Achsen auch als parametrierbare Werte auf Calculator-Codes zu mappen.

Beispielsweise die Light-Potis für das VC

A32NX_LIGHT_POTI_CPT_PFD#@ 10.23 / $Param 16384 + 327.86 / max 100 min 88 (>K:2:LIGHT_POTENTIOMETER_SET)
A32NX_LIGHT_POTI_CPT_ND#@ 10.23 / $Param 16384 + 327.86 / max 100 min 89 (>K:2:LIGHT_POTENTIOMETER_SET)
A32NX_LIGHT_POTI_CPT_WX_TERR#@ 10.23 / $Param 16384 + 327.86 / max 100 min 94 (>K:2:LIGHT_POTENTIOMETER_SET)
A32NX_LIGHT_POTI_CPT_CONSOLE#@ 10.23 / $Param 16384 + 327.86 / max 100 min 8 (>K:2:LIGHT_POTENTIOMETER_SET)
A32NX_LIGHT_POTI_FO_PFD#@ 10.23 / $Param 16384 + 327.86 / max 100 min 90 (>K:2:LIGHT_POTENTIOMETER_SET)
A32NX_LIGHT_POTI_FO_ND#@ 10.23 / $Param 16384 + 327.86 / max 100 min 91 (>K:2:LIGHT_POTENTIOMETER_SET)
A32NX_LIGHT_POTI_FO_WX_TERR#@ 10.23 / $Param 16384 + 327.86 / max 100 min 95 (>K:2:LIGHT_POTENTIOMETER_SET)
A32NX_LIGHT_POTI_CPT_CONSOLE#@ 10.23 / $Param 16384 + 327.86 / max 100 min 9 (>K:2:LIGHT_POTENTIOMETER_SET)
A32NX_LIGHT_POTI_FCU#@ 10.23 / $Param 16384 + 327.86 / max 100 min 87 (>K:2:LIGHT_POTENTIOMETER_SET)
A32NX_LIGHT_POTI_ECAM_UPPER#@ 10.23 / $Param 16384 + 327.86 / max 100 min 92 (>K:2:LIGHT_POTENTIOMETER_SET)
A32NX_LIGHT_POTI_ECAM_LOWER#@ 10.23 / $Param 16384 + 327.86 / max 100 min 93 (>K:2:LIGHT_POTENTIOMETER_SET)
A32NX_LIGHT_POTI_Displays#@ 10.23 / $Param 16384 + 327.86 / max 100 min 88 (>K:2:LIGHT_POTENTIOMETER_SET) @ 10.23 / $Param 16384 + 327.86 / max 100 min 89 (>K:2:LIGHT_POTENTIOMETER_SET) @ 10.23 / $Param 16384 + 327.86 / max 100 min 93 (>K:2:LIGHT_POTENTIOMETER_SET) @ 10.23 / $Param 16384 + 327.86 / max 100 min 92 (>K:2:LIGHT_POTENTIOMETER_SET) @ 10.23 / $Param 16384 + 327.86 / max 100 min 87 (>K:2:LIGHT_POTENTIOMETER_SET)

Der Text $Param wird dabei von FSUIPC mit dem Wert der von der Achse ermittelt wurde ersetzt. Da bei mir die Werte zwischen -16384 und 16383 liegen, habe ich noch etwas Mathematik zu den Calculator-Codes von Mobiflight gepackt.

Zugewiesen werden diese "eigenen" Presets aus der zuvor im FSUIPC Hauptverzeichnis abgelegte myevents.txt dann wie folgt:

  1. "Scan" klicken und Achse bewegen, damit diese erkannt wird
  2. "Select for Preset" checkbox anwählen, damit die Auswahlliste auf die Presets reduziert wird
  3. "Send to FS as normal axis" wählen
  4. aus der Liste das/die gewünschten Presets auswählen.

Buttons / Rotaries

Können über FSUIPC direkt, über LINDA oder auch über "Axis And Ohs" (AAOs) gemacht werden.

FSUIPC Presets & Funktionen auf 'Joystick' Buttons

werden ähnlich wie die in der obigen Abbildung gezeigten Schritte zugewiesen, jedoch im Teil "Buttons & Switches" des Zuweisungsmenüs in FSUIPC.

Preset to button assignment
  1. Taste oder Schalter betätigen
  2. Select 4 Preset (ggf. Select for FS control) wählen
  3. Funktion auswählen die getriggert werden soll, wenn die Taste "gedrückt" wird
  4. ggf. Funktion auswählen die getriggert werden soll, wenn die Taste "losgelassen" wird.

in Lua Scripten

Lua Scripte sind die Basis für die LINDA Modules welche eine sehr einfache Zuordnung von Funktinoen auf Buttons, Drehgeber und Schalter über die Donationware "LINDA" ermöglichen.

Soll mit LINDA gearbeitet werden, müssen die gewünschten Funktionen in der actions.Lua des entsprechenden Flugzeug-Moduls in Funktionen definiert werden.

Ein sehr guter Einstieg in die Erstellung von LINDA Modules ist, sich bereits verfügbare Modules anzusehen, und daraus Anregungen zu übernehmen.

LVar

gut bekannt von FSX und P3D. LVars benötigen kein Mobiflight. Die Zuordnung über FSUIPC sehr weit fortgeschritten und gut bekannt.

L:

temp = ipc.readLvar("L:abc")
ipc.writeLvar("L:abc", value)

HVar (Events)

H:

Events die unabhängig von FSUIPC Updates dauerhaft verfügbar sein sollen, kommen in eine Datei unterhalb

C:\Users\DEIN_USERNAME\AppData\Local\Packages\Microsoft.FlightSimulator_8wekyb3d8bbwe\LocalState\packages\fsuipc-lvar-module\work

Execute_Calculator_Code

K:   /   SimVar

Die "calculatorCodes" sind Implementierungen die mal einfache Aktionen, mal komplexere code Ausführungen mit Abhängigkeiten sind.

Beispiele

aus Mobiflight HubHop / Developer Tools .

ipc.execCalcCode("(>K:A32NX.FCU_AP_1_PUSH)")
ipc.execCalcCode("1 s0 (>L:LIGHTING_TAXI_2) 2 l0 (>K:2:TAXI_LIGHTS_SET) 3 l0 (>K:2:TAXI_LIGHTS_SET)")
(L:A32NX_FIRE_BUTTON_ENG1) ! if{ (L:A32NX_FIRE_GUARD_ENG1) ! (>L:A32NX_FIRE_GUARD_ENG1) }
ipc.execCalcCode("(A:CIRCUIT SWITCH ON:80,bool) ! if{ 80 (>K:ELECTRICAL_CIRCUIT_TOGGLE) } 75 80 (>K:2:ELECTRICAL_CIRCUIT_POWER_SETTING_SET)")
ipc.execCalcCode("(L:ParkingBrake_Position) 0 > if{ 0 (>L:ParkingBrake_Position) } els{ 100 (>L:ParkingBrake_Position) }")

entspricht etwas besser lesbar

if ((L:ParkingBrake_Position) > 0) {
  (>L:ParkingBrake_Position) = 0
} else {
  (>L:ParkingBrake_Position) = 100
}
Wichtig:

 

Achtung: Steht im Verdacht längerfristig Performanceprobleme zu machen:
WASM: execute_calculator_code leaks memory and reduces performance over time

FSUIPC Offsets

werden mal in Hex-Schreibweise mal in Dezimalschreibweise angegeben.

Umrechnung z. B. über https://www.rapidtables.com/convert/number/hex-to-decimal.html

ipc.writeUW(0x0892, 2)
ipc.readUW(0x0892)

Linksammlung

Coding

Lua Script Sprache

https://www.lua.org/docs.html stellt u. a. die Anleitung für die Scriptsprache bereit.

RPN (UPN) Dokumentation

https://docs.flightsimulator.com/html/Additional_Information/Reverse_Polish_Notation.htm

postfix-infix (UPN) online converter für die RPN/UPN in Calculator Codes

https://scanftree.com/Data_Structure/prefix-postfix-infix-online-converter

Umrechnung von Zahlen

z. B. für FSUIPC offsets https://www.rapidtables.com/convert/number/hex-to-decimal.html

Git Versionskontrollsystem

Ein großer Vorteil an FSUIPC und LINDA ist, dass sie Ihre Konfigurationen in Textdateien (ini, Lua, txt, evt) in einem einfachen Ordner ablegen.

Um unkompliziert bei Änderungen jederzeit auf einen vorherigen Stand zurück zu kommen, oder auch einfach nur vergleichen zu können, was sich gegenüber der vorherigen Version verändert hat, nutze ich gern git.

Git ist ein Werkzeug zur Code-Versionierung und die Basis für die Zusammenarbeit mit mehreren Beitragenden z. B. bei der Entwicklung von LINDA Modulen wie z. B. dem für das FBW A32nx auf Github.

Git ist ein (kosten)freies und quelloffenes, verteiltes Versionskontrollsystem, das entwickelt wurde, um alles von kleinen bis zu sehr großen Projekten schnell und effizient zu bearbeiten.

Git ist leicht zu erlernen und hat einen winzigen Fußabdruck mit blitzschneller Leistung.

VS Code

https://code.visualstudio.com/ ist als Texteditor für die Bearbeitung von Lua files, ini-Dateien aber auch log-files, HTML, SVG, JS aber auch für Arduino-Projekte im kostenfreien Bereich nahezu unschlagbar.

Als Open Source mit tausenden oft genialen extensions, syntax highlighting, autocompletion usw. erleichtert es die Arbeit mit textbasierten Dateien enorm und bietet sogar die Möglichkeit der Integration von Git SCM.

Einer der besonderen Vorteile ist, dass Dateien nicht blockierend geladen werden und daher z. B. auch beim Debuggen von FSUIPC und LINDA geöffnet bleiben können, während noch in die Datei geschrieben wird. Dadurch kann viel unkomplizierter nach Fehlern gesucht werden.

Auch Multi-Cursor, Suchen und Ersetzen von Dateiinhalten in ganzen Ordnerstrukturen etc. ist damit problemlos möglich.

Other Tools

Mobiflight Connector

Download von https://www.mobiflight.com
benötigt wenn mit HVar Dateien (Flugzeugspezifischen Events) gearbeitet werden soll wie dies z. B. beim A32nx LINDA aircraft module der Fall ist.
HVar werden u. a. in https://github.com/joeherwig/A32nx-LINDA-aircraft-module verwendet und müssen daher über das mobiflight connector WASM verfügbar gemacht sein.
Siehe FSUIPC 7 Doku in "FSUIPC7 for Advanced Users.pdf" und die sehr guten Tutorial Videos.

Axis And Ohs

Download von https://axisandohs.weebly.com/
bringt zusätzlich zu den oben genannten Tools die Möglichkeit auch MIDI Controller - und nicht nur USB Game Controller und VRInsight Combo Panels als Controller zu nutzen.

Auch gibt es direkt WebInstruments und Saitek Support.

Insbesondere aufgrund der online verfügbaren Profile für das Behringer X-Touch Mini ist eine sehr günstige Erweiterung auf Hardware-Inputs damit möglich.

Ich verwende gerne die Software Axis and Ohs für den MSFS, da ich mich dann um den ganzen Midi-zu-Joystick Kram nicht kümmern muss, und einfach direkt in der Software mittels grafischer Benutzeroberfläche die unterschiedlichen Steuerungsprofile erstellen, und ggf. für mehrere Flieger wiederverwenden kann. Das Ergebnis sind dann die sog. "Templates", oder "Profiles", welche fleißig bei Flightsim.to geteilt werdenn (AAO Profile), und einfach in Axis and Ohs einem bestimmten Flieger zugewiesen werden können. Wer keine Lust hat sich mit Scripten im MSFS zu befassen, um z.B. einzelne Buttons unter bestimmten Umständen leuchten zu lassen, der fährt damit goldrichtig. U.a. auch weil dann das ständige manuelle Auswählen eines Steuerungsprofils im MSFS beim Flugzeugwechsel entfällt.

Was wenn's klemmt?

FSUIPC hat WASM Menüpunkte ausgegraut

ausgegraute Menüpunkte unter WASM in FSUIPC

So wird's gelöst

Siehe Vorbereitende Konfiguration | FSUIPC7.ini | WAPI

Sollte die WAPI aktiv sein, kommt es ab und an auch mal vor, dass sich einfach was "verheddert" hat. Im Simflight-Forum wird empfohlen einfach noch mal neu zustarten. Zumindest alles was zum Simulator gehört. Gern auch einfach den Rechner noch mal neu starten.

Bei mir reicht in der Regel alles was zum Sim gehört neu zu starten, zumindest jedoch MSFS, FSUIPC, LINDA.

0 HVar found?

Wenn keine hvar gefunden werden, liegt es ggf. daran, dass das die aktuelle Livery dem Flieger nicht zugeordnet werden kann.

Ein möglicher Grund ist, dass in der Aircraft.cfg der title der Livery nicht sauber angegeben wurde.

Wenn FSUIPC im Standard installiert wurde, und dann z. B. ein Profile für A32angelegt wurde, wird erwartet, dass das der Flieger über den Aircraft title identifiziert wird. Damit wird erwartet, dass für ein [A32] profil im Title auch irgendwo 'A32' vorkommt. Viele der Livery-Designer haben sowas jedoch nicht auf dem Schirm.

Ein Beispiel hierfür ist die Regierungsflieger-Livery für den A320 / A32nx.

[VERSION]
major = 1
minor = 0
 
[VARIATION]
base_container = "..\FlyByWire_A320_NEO"
 
;===================== FLTSIM =====================
 
[FLTSIM.0]
title = "Regierungsflieger"; Variation name
[VERSION]
major = 1
minor = 0
 
[VARIATION]
base_container = "..\FlyByWire_A320_NEO"
 
;===================== FLTSIM =====================
 
[FLTSIM.0]
title = "Airbus A320 Regierungsflieger" ; Variation name

Ein paar Livery-Beispiele - alle für Denselben Flieger:

title = "Airbus A320neo FlyByWire"
title = "Airbus A320 Neo Lufthansa-D-AIJA"
title = "Regierungsflieger"
title = "FWB Eurowings D-AIZO"

So wird's gelöst - wenn's schnell gehen muss

z. B. weil man gleich online fliegen will.

einfach mit einer Livery fliegen, mit der es schon mal funktioniert hat.

Funktioniert, ist aber Schrott!

Bei der Livery den Titlestring zu korrigieren. Macht das bitte nicht, denn ansonsten geht mit dem nächsten Livery-Update der Spaß von vorne los.

So wird's richtig gelöst

Seit FSUIPC v7.2.15 ist es möglich in FSUIPC7.ini und WASM.ini dank zweier Konfigurationsparmeter das cleverer zu gestalten.

UseAirLocForHvars=Yes

in der FSUIPC_WASM.ini in deinem /Community/fsuipc-lvar-module/WASM Ordner das Verhalten zu ändern.

UseAirLocForProfiles=Yes

Wenn ihr diese Parameter auf Yes setzt, erfolgt der hvar- und Profil-Abgleich nicht mehr über den Flugzeugnamen (title), sondern über den base_container wie er in der aircraft.cfg der Livery definiert ist. Damit ordnet FSUIPC das Basis-Flugzeugs welches Model und Variablen definiert und referenziert nicht mehr auf die jeweilige Livery.

FSUIPC Websocket Server "access denied"

Wird der FSUIPC Websocket-Server nicht als Admin gestartet, grätscht Windows dazwischen, wenn der Port nicht auf localhost oder 127.0.0.1 oder gebunden werden soll.

Da insbesondere bei der Nutzung von anderen Netzwerkgeräten wie Arduino, raspberry pie oder Smartphone / Tablet etc. dann aber keine Nutzung möglich ist, bleiben nur zwei Varianten.

FSUIPC Websocket-Server shows access denied

Warum?

Jede Anwendung, die im Administratormodus läuft, kann sich für eine URL registrieren. Eine Nicht-Administrator-Anwendung muss netsh http add urlacl verwenden, um die Anforderung zu erhalten.

Funktioniert, ist aber Schrott!

Starten von FSUIPC und FSUIPC als lokaler Admin.
Löst zwar vermeintlich das Problem, hebelt aber die MS UAC aus und schafft ggf. weitere Probleme. Daher bitte nicht nur deswegen als lokaler Admin starten!

So wird's richtig gelöst

Über einen Befehl der einmalig in der Windows-Console [Strg]+[r] ausgeführt werden muss, wird dem Websocket-Server erlaubt, sich auch ohne Admin-Berechtigung auf den TCP port zu verbinden und seine Daten dort anzubieten.

 netsh http add urlacl url=http://computername:port/ user=username

Bitte ersetzt natürlich

 netsh http add urlacl url=http://DellP:2048/ user=joe

WebSocketServer

Beispiel um calculator Codes (und damit auch Events und LVars) zu schreiben.

<html> 
 <head> 
   <script>
     ws = new WebSocket('ws://DellP:2048/fsuipc/', "fsuipc");
     
     ws.onopen = function () {
       console.log("connectionStatus = Connection Open");
     };
     
     ws.onclose = function () {
       console.log("connectionStatus = Connection Closed");
       ws = null;
     };
     
     ws.onmessage = function(event) {
       console.log("[message] Data received from server: " + event.data);
     };
     
     ws.onerror = function () {
       console.log("connectionStatus = WebSocket Error");
     }
     
     function setBrake(value) {
       ws.send("{ \"command\": \"vars.calc\", \"name\": \"calc\", \"code\": \""+value+" (>K:PARKING_BRAKE_SET)\"}");
       console.log("sent\n\n"+ "{ \"command\": \"vars.calc\", \"name\": \"calc\", \"code\": \""+value+" (>K:PARKING_BRAKE_SET)\"}");
     }
   </script>
 </head>
 <body>
   <input type="button" onClick="setBrake(1);" value="set parking-brake ON"/>
   <input type="button" onClick="setBrake(0);" value="set parking-brake OFF"/>
 </body>
</html>