Lorby's AAO (Axis And Ohs)

  • Hier mal ein Beispiel für die Programmierung eines Schalters für den Separator der TBM 930:


    Start AAO, der SIM muss laufen!


    Script


    • Einlesen der lokalen Variablen (flugzeugspezifisch): roter Rahmen
    • Nach Einlesen (Meldung abwarten), Script Editor starten: blauer Rahmen


    Beim Start sind die grün, gelb und schwarz umrandeten Bereiche zunächst leer.


    • Nun den rot umrandeten Bereich "Insert sim var" aufrufen: es erscheint folgendes Zusatzfenster:


    • blau umrandete Feld: Eingabe der Teile der Variablen ein (sofern bekannt)
    • Aktivierung des Filters (gelb umrandetes Feld)
    • Ergebnis
    • Im vorliegenden Fall wird die rot umrandete Variable, die verändert werden kann (Settable: Yes), per Doppelklick inserted:


    Hier muss folgendes beachtet werden:

    • Der Script sollte den Namen der Varaiblen tragen (grün umrandet)
    • Es sollte die Gruppe Scripts ausgewählt werden
    • Da hier ein Toggle verwendet werden soll, muss statt Number Bool geschrieben werden.
    • Das ! wertet den Schaltzustand aus und schaltet in die entgegengesetzte Richtung
    • Der rechte Teil (beginnt mit ">") setzt die Variable auf den neuen Zustand
    • Der "." ist das Leerzeichen!!!
    • Gespeichert wird über "Save as New"
    • Veränderungen des Scripts werden über"Update" gespeichert
    • Der Script kann sofort über "Test" überprüft werden

    Zuweisung eines Buttons zum Script wie gehabt:



    Das ganze funktioniert auch für FSX und P3D, unter der Voraussetzung, dass die gesuchte Variable auch vorhanden ist.


    Weiterführende Info's unter:


    http://www.prepar3d.com/SDKv3/…ipting/rpn_scripting.html


    Ralf

    Dieser Beitrag wurde bereits 1 Mal editiert, zuletzt von rgd ()

  • In diesem Falle zu Tools&addons - das ist aber eine prima Idee. Ähnliches gibt es für streamdeck ebenfalls und nicht jeder ist derart computeraffin, dass er was mit Variablen und scripts anfangen kann. Danke Ralf für diese Einführung. Ich hoffe auf rege Beteiligung, das hat axis&ohs aus meiner Sicht verdient.

  • Hier ein Script für einen Toggle Taster/Button zum wechseln vom SELECTED SPEED auf MANAGED SPEED im A320neo


    (A:AUTOPILOT·SPEED·SLOT·INDEX,·Number)·1·==·if{2·(>K:SPEED_SLOT_INDEX_SET)} els{ 1·(>K:SPEED_SLOT_INDEX_SET)}


    Für einen Kippschalter bzw. für einen ONOFF Button (Axis and ohs) auf dem StreamDeck benötigt man 2 Scripte:

    1. “Managed Speed Mode” : 2·(>K:SPEED_SLOT_INDEX_SET)
    2. “Selected Speed Mode” : 1·(>K:SPEED_SLOT_INDEX_SET)


    Gruss Oliver

  • Hallo ,

    hier ein Beispiel für Events mit Erweiterung "|n"

    (K:Event|n)


    Standart Trimmung Nase Hoch: 1·(>K:ELEV_TRIM_UP)

    Erweiterung: 1·(>K:ELEV_TRIM_UP|5)

    durch die Erweiterung "|5" wird dieser Befehl 5 mal ausgeführt

  • Hier noch ein Beispiel zur Programmierung der Drehschalter im EFIS des A320neo auf 2 Taster INC/DEC


    Z.B Anzeigemodus des Navigationsdisplays


    Inc(Drehschalter rechtsrum):

    (L:A320_Neo_MFD_NAV_MODE,·Number)·4·<=·if{·(L:A320_Neo_MFD_NAV_MODE,·Number)·1·+·(>L:A320_Neo_MFD_NAV_MODE,·Number)·}


    Dec(Drehschalter linksrum):

    L:A320_Neo_MFD_NAV_MODE,·Number)·1·>=·if{·(L:A320_Neo_MFD_NAV_MODE,·Number)·1·-·(>L:A320_Neo_MFD_NAV_MODE,·Number)·}



    Gruss Oliver

  • Guten Tag,


    manchmal benötigt man einfach nur einen Knopf für einen Schalter, der zwischen den beiden Schaltzuständen "toggelt" - z.B. "an" und "aus" - und zwar ungeachtet dessen, welcher Schalterposition gerade aktiv ist:


    1 (K:Variable) - (>K:Variable)

    In dieser kleinen Subtraktionsrechnung stehen quasi (nach rpn-Syntax) zwei Zahlen, nämlich eine statische "1" als Minuend und der Schaltzustand der Variablen (0 oder 1) als Subtrahend, Mit dem Ergebnis dieser Rechnung wird die Variable dann neu beschrieben.


    Das ">" vor einer Variablen ist immer der "Setter", d.h. damit wird eine Variable neu beschrieben.


    Folglich lautet die Rechnung für einen einfachen Toggle:

    1 - 0 = 1 (Schalter war aus und wird eingeschaltet)

    1 - 1 = 0 (Schalter war ein und wird ausgeschaltet)


    Man beachte in diesem Zusammenhang die ungewöhnliche "Rückwärtsschreibweise" in dieser Sprache.

    Herzliche Grüße :-)

    Oliver


    Add me:

    MSFS-Name: plerzelwupp


  • Wenn wir schon dabei sind :-)


    Vielleicht erinnert ihr euch an den 3er-Schalter, den ich für das Licht der TBM 930 mit Lorbys Hilfe als Toggle programmierte. Nachfolgenden Code hatte ich hier erklärt.


    (L:XMLVAR_LANDING_TAXI_OFF_Switch_Position,·Number)·2·==·if{·1·(>K:TOGGLE_TAXI_LIGHTS)·}·(L:XMLVAR_LANDING_TAXI_OFF_Switch_Position,·Number)·1·==·if{·1·(>K:TOGGLE_TAXI_LIGHTS)·1·(>K:LANDING_LIGHTS_TOGGLE)·}·(L:XMLVAR_LANDING_TAXI_OFF_Switch_Position,·Number)·0·==·if{·1·(>K:LANDING_LIGHTS_TOGGLE)·}


    Verwendet werden also nur Bedingungen - in Abhängigkeit der L-Variablen, also hintereinander gereihte Bedingungen (nur "if" ohne die "Else"). :-) Was ein Monstrum eines Schalters.


    Es geht aber auch einfacher, indem man den Modulo-Operator verwendet. Erinnert Ihr Euch? Mathematik? Kann auch Spaß machen. :-) Den Tipp fand ich in der JayDee-Community auf DC. Das geht natürlich nur dann, wenn die Variable direkt beschrieben wird, was im obigen Fall nicht möglich ist, weil diese proprietäre L:Var nicht "settable" ist (meines Wissens gibt es diesen Schalter auch nur in der TBM 930). Daher mussten wir die beiden K-Variablen heranziehen, die von MSFS bereitgestellt werden und für den kompletten Sim gelten.


    So, nun aber zurück zum Thema. Hier die einfache Wikipedia-Erklärung zum Modulo.


    Demnach kann ein Toggle 0/1/2/0..... eben mit diesem Modulo-Operator geschaltet werden, welcher ja den Rest einer ganzzahligen Division zurückgibt. Salopp gesagt, die Rechnung blendet die Zahl vor dem Komma aus und und gibt als Ergebnis den Rest als Dividend des Quotienten zurück.


    0 % 3 = 0 Rest (also 0/3 = 0 + 0/3)

    1 % 3 = 0 Rest 1 (also 1/3 = 0 + 1/3)

    2 % 3 = 0 Rest 2 (also 2/3 = 0+2/3)

    3 % 3 = 1 Rest (also 3/3 = 1 + 0/3)


    Der Rest ist also die Differenz zwischen dem Dividenden und dem größten Vielfachen des Divisors, das höchstens so groß ist wie der Dividend. Ein Rest ungleich 0 ergibt sich folglich genau dann, wenn der Dividend kein Vielfaches des Divisors ist. Man sagt auch: Der Dividend ist nicht durch den Divisor teilbar, weshalb ein Rest übrigbleibt.


    Also nehmen wir die Variable, addieren 1 dazu, dividieren das durch 3 und nehmen nur "den Modulo" bzw. den Rest. Mit diesem beschreiben wir dann die Variable neu.


    Lange Rede kurze Sinn - es ergibt sich also folgender Code:

    Code
    1. (L:VARIABLE, Number) 1 + 3 % (>L:VARIABLE, Number)


    Also wenn die Variable 0 war, wird auf 1 geschaltet:

    (0+1) % 3 = 1


    Wenn die Variable 1 war wird auf 2 geschaltet:

    (1+1) % 3 = 2


    Wenn die Variable 2 war wird auf 0 geschaltet:

    (2+1) % 3 = 0


    Hier schließt sich der Kreis wieder. Auf diese Weise lassen sich natürlich auch 3,4 oder 5 Schalterstellungen sehr einfach programmieren. Mit nur einer einzigen Zeile.


    Und schon haben wir dieses lästigen "if" und "else" umgangen - die Formel ist sehr kurz, die Erklärung war lang. :bonk:


    Aber ich finde es ist wichtig, dass man diese Operatoren mal verstanden hat.

    Herzliche Grüße :-)

    Oliver


    Add me:

    MSFS-Name: plerzelwupp


    Dieser Beitrag wurde bereits 4 Mal editiert, zuletzt von plerzelwupp ()

  • Hallo hier noch ein Bsp. für die Einstellung Autobrake (stärke der Bremsautomatik) beim A320neo:


    Event: n (>K:SET_AUTOBRAKE_CONTROL)


    n=1 keine Anzeige

    n=2 LO on

    n=3 MED on

    n=4 Max on


    Rückmeldevariable : XMLVAR_Autobrakes_Level, Number


    wobei 0: keine Anzeige

    1: LO on

    2: MED on

    3: MAX on


    Für das StreamDeck können drei Taster mit folgenden Befehlen belegt werden:


    2 (>K:SET_AUTOBRAKE_CONTROL) für Taster "LO"

    3 (>K:SET_AUTOBRAKE_CONTROL) für Taster "MED
    4 (>K:SET_AUTOBRAKE_CONTROL) für Taster "MAX"


    Es geht auch mit einem Event-Taster(AAO)/(Joystick)Button, dann wird folgendes Script benötigt:


    (L:XMLVAR_Autobrakes_Level,·Number)·0·==·if{2·(>K:SET_AUTOBRAKE_CONTROL)}·(L:XMLVAR_Autobrakes_Level,·Number)·1·==·if{3·(>K:SET_AUTOBRAKE_CONTROL)}·(L:XMLVAR_Autobrakes_Level,·Number)·2·==·if{4·(>K:SET_AUTOBRAKE_CONTROL)}·(L:XMLVAR_Autobrakes_Level,·Number)·3·==·if{1·(>K:SET_AUTOBRAKE_CONTROL)}


    Liebe Grüße


    Oliver



  • Hallo zusammen,

    Habe das ganze geht auch mit der "Modulo-Variante" von plerzelwupp ausprobiert:



    (L:XMLVAR_Autobrakes_Level,·Number)·1·+·4·%·(>L:XMLVAR_Autobrakes_Level,·Number)·


    Funktioniert auch( Springt von "LO" zu "MED" zu "MAX" und zurück zu "LO".


    Gruss


    Oliver

  • Hallo zusammen,


    zum durchschalten der Reichweite im Navigationsdisplays, kann der "Range" Drehschalter (10/20/40/80/160/320) im EFIS Panel

    nur mit einem Button bedient werden.


    Es wird folgendes Script benötigt (Dank an plerzelwupp!):


    (L:A320_Neo_MFD_Range,·Number)·1·+·6·%·(>L:A320_Neo_MFD_Range,·Number)


    Der Drehschalter springt zu den Einstellungen 10, 20, 40, 80, 160, 320 und zurück auf 10.


    Liebe Grüße


    Oliver


    PS : Hat irgendwer eine Idee wie die Drehfolge geändert werden kann (320/160/80/40/20/10)?


    Eingeschränkt geht es mit folgendem Script:

    (L:A320_Neo_MFD_Range,·Number)·1·-·6·%·(>L:A320_Neo_MFD_Range,·Number)

  • Hallo zusammen,

    mit einer "If" Schleife kann die Reihenfolge umgekehrt werden.


    ND Range von 10 nach 20/40/80 u.s.w : (L:A320_Neo_MFD_Range,·Number)·1·+·6·%·(>L:A320_Neo_MFD_Range,·Number)


    Lösung für umgekehrte Reihenfolge 320/160/80 u.s.w. : (L:A320_Neo_MFD_Range,·Number)·1·-·6·%·(>L:A320_Neo_MFD_Range,·Number)·(L:A320_Neo_MFD_Range,·Number)·0·==·if{6·(>L:A320_Neo_MFD_Range,·Number)}


    Gruß Oliver


    PS : Je nach Schalterstellung(Umsprung von 10 zurück auf 320) lässt sich der Drehschalter nicht mehr mit der Maus bedienen.

    Nach dem Umsprung muss das Script 1x zusätzlich ausgeführt werden.

  • Hallo Oliver,


    also das geht - wir müssen ja erst 5 addieren, bevor wir abziehen :-)


    (L:A320_Neo_MFD_Range,·Number)·5·+·6·%·(>L:A320_Neo_MFD_Range,·Number)


    Vielen Dank für die Inspirationen - macht Spaß :-)

    Herzliche Grüße :-)

    Oliver


    Add me:

    MSFS-Name: plerzelwupp


  • Hallo Oliver,


    klar das geht auch. Ich wollte halt beim eleganten Modulo bleiben :-)

    Code
    1. (L:A320_Neo_MFD_Range,·Number)·5·+·6·%·(>L:A320_Neo_MFD_Range,·Number)

    Wir jagen den Wert bei Var5 erst auf 10 hoch, teilen das durch 6. Das ergibt 1 (Rest 4/6)

    bei Var4 sind wir dann auf 9 bei 9/6, ergibt 1 und einen Rest von 3/6

    usw...

    Herzliche Grüße :-)

    Oliver


    Add me:

    MSFS-Name: plerzelwupp


    Dieser Beitrag wurde bereits 3 Mal editiert, zuletzt von plerzelwupp ()

  • Hallo Oliver

    Habe den Fehler auch schon gefunden


    Meine Lösung ist : (L:A320_Neo_MFD_Range,·Number)·1·-·6·%·(>L:A320_Neo_MFD_Range,·Number)·(L:A320_Neo_MFD_Range,·Number)·0·==·if{5·(>L:A320_Neo_MFD_Range,·Number)}


    Deine Lösung werde nach dem Abendessen ausprobieren.


    Gruss Oliver

  • Hallo Oliver,


    zu dem Punkt:

    Eingeschränkt geht es mit folgendem Script:

    (L:A320_Neo_MFD_Range,·Number)·1·-·6·%·(>L:A320_Neo_MFD_Range,·Number)


    Das Problem beim Runterzählen mit -1 entsteht dadurch, dass der Wert in den Bereich der negativen Zahlen kommen kann. Die Modulorechnung hat kein Problem damit, die liefert fleißig ...2, 1, 0 ,-1, -2, ...-5, aber der Sim kriegt dann Schwierigkeiten. Daher musst Du eine Bremse einbauen, entweder mit einer if Anweisung, oder aber für die Freunde der kompakten Ausdrücke mit einem max Statement:


    (L:A320_Neo_MFD_Range_1,·Number)·1·-·6·%·0·max·(>L:A320_Neo_MFD_Range_1,·Number)


    Erläuterung:

    ein RPN Ausdruck

    A B max

    liefert als Ergebnis den größeren der beiden Werte A und B zurück. Somit verhinderst Du mit A 0 max (>LVar), dass LVar < 0 wird.


    Gruß,

    Frank

  • Hallo,


    mir ist grad aufgefallen, dass mit min und max die Modulorechnung überflüssig wird. Schade, hat mir so gut gefallen.


    Zum Hochdrehen:

    (L:A320_Neo_MFD_Range_1,·Number)·1·+·5·max·(>L:A320_Neo_MFD_Range_1,·Number)


    Zum Runterdrehen:

    (L:A320_Neo_MFD_Range_1,·Number)·1·-·0·min·(>L:A320_Neo_MFD_Range_1,·Number)


    Es führen halt viele Skripte nach Rom.


    Gruß,

    Frank

  • Ja genau, Frank


    das hab ich auch grad durchgetestet (A+O RPN-Script Test). Also entweder das "if", oder durch das (bislang mir unbekannte) max Statement. Danke für den Tipp - sehr raffiniert. Zuletzt noch die nackte Modulo Variante (hab meinen vorherigen Beitrag noch mit einer kleinen Erläuterung versehen). Dann die Max-Bremse ohne Modulo. in dem Fall noch eleganter.


    Sehr schön - jetzt haben wir 4 Lösungen für das gleiche Problem. Ich fasse zusammen:


    if-Variante

    Code
    1. (L:A320_Neo_MFD_Range,·Number)·1·-·6·%·(>L:A320_Neo_MFD_Range,·Number)·(L:A320_Neo_MFD_Range,·Number)·0·==·if{5·(>L:A320_Neo_MFD_Range,·Number)}


    Modulo nackt

    Code
    1. (L:A320_Neo_MFD_Range,·Number)·5·+·6·%·(>L:A320_Neo_MFD_Range,·Number)


    Max Statement

    Code
    1. (L:A320_Neo_MFD_Range_1,·Number)·1·-·6·%·0·max·(>L:A320_Neo_MFD_Range_1,·Number)


    Edit: Max Statement ohne Modulo

    Code
    1. (L:A320_Neo_MFD_Range_1,·Number)·1·-·0·min·(>L:A320_Neo_MFD_Range_1,·Number)


    Das fängt allmählich an, Spaß zu machen. So können wir voneinander lernen. Top. :-)

    Hat noch jemand eine Idee? :-)

    Herzliche Grüße :-)

    Oliver


    Add me:

    MSFS-Name: plerzelwupp