Sign in to follow this  
Guenni99

passendes DataRefs finden

Recommended Posts

Hallo Zusammen,

 

ich möchte mittels FlyWithLua einen Schalter mit einer Funktion belegen.

Zu Beginn meiner Forschungen habe ich mir den "HDG"-Knopf auf dem Autopilot-Panel der Beechcraft Baron 58 (Standard-Flieger) ausgesucht.


Dafür muss ich folgende Fragen beantworten:

 

1. Welche Schalternummer hat der Schalter meiner Begierde (mit dem Menüpunkt "Plugins, FlyWithLua, FlyWithLua Macros, Show joystick button numbers" ist das ja leicht rauszufinden)

2. Welche Variable im "Datarefs" muss ich nutzen. Hier beginnen die Probleme:
2a. Welche der viiieeeelen Datarefs werden überhaupt für die Baron 58 genutzt und können angesprochen werden.
2b. Was ist die richtige Dataref, der dem "HDG"-Knopf entspricht:
sim/cockpit/autopilot/heading_mode oder sim/cockpit2/autopilot/heading_hold_status oder sim/cockpit2/autopilot/heading_mode oder ......

 

Das geht doch bestimmt anders als alle zu probieren... oder?

 

Es ginge in diesem Beispiel zwar auch mit der X-Plane eingebauten Zuordnung von Schaltern zu einer "Funktion" (=Dataref), aber ich will da natürlich noch mehr Funktionen reinpacken...

 

Günter

Share this post


Link to post
Share on other sites

Mit den Datarefs liegst du schon richtig.

Diese bilden die Schnittstelle zwischen den Scripten und dem "XP-Kernel",

mehr kenne ich auch nicht (auser den SDK Funktionen für Plugins).

 

Ich habe mir bisher immer so beholfen:

 

1) den Dataref Editor starten

2) Bei vorhandenen Fliegern nachschauen, welches Dataref sich bei welchen Schalterbetätigungen ändert.

3) In der Auflistung der Datarefs suchen

   ..\Resources\plugins\DataRefs.txt   oder z.B. http://www.xsquawkbox.net/xpsdk/docs/DataRefs.html

 

HDG Knopf?

 

Wenn den AP meinst, schau mal hier:

 

local autopilot_mode = dataref_table("sim/cockpit/autopilot/autopilot_mode")
local VVI  = dataref_table("sim/cockpit2/autopilot/vvi_dial_fpm")
local vfpm = dataref_table("sim/cockpit2/gauges/indicators/vvi_fpm_pilot")
local vvi_mem = -1

local vvi_status        = dataref_table("sim/cockpit2/autopilot/vvi_status")
local nav_status        = dataref_table("sim/cockpit2/autopilot/nav_status")
local hdg_status        = dataref_table("sim/cockpit2/autopilot/heading_status")
local pit_status        = dataref_table("sim/cockpit2/autopilot/pitch_status")
local alt_hold_status   = dataref_table("sim/cockpit2/autopilot/altitude_hold_status")
local altitude_mode     = dataref_table("sim/cockpit2/autopilot/altitude_mode")
local approach_status   = dataref_table("sim/cockpit2/autopilot/approach_status")
local avionics_power_on = dataref_table("sim/cockpit2/switches/avionics_power_on")
local main_battery_on   = dataref_table("sim/cockpit2/electrical/battery_on")

local avionic_power_OLD_on = avionics_power_on[0]
local main_battery_OLD_on = main_battery_on[0]

local AP_has_power = true
local AP_has_power_OLD = true

 

Wenn du den HDG Bug meinst, dann eher hier:  siehe Attachment

 

Am Ende des Scriptes werden Funktionen definiert, welche im Flusi über das Menü mit Tasten verknüpft werden können.

Die Taste ruft dann die Funktion, die Funktion verstellt dann Datarefs.

 

In meinem Beispiel wähle ich über die Tastatur zuerst aus, welches Gerät ich bedienen will (HDB Bug, Freq. für Com1, Com2. Nav1, nav2, etc.)

Danach verstelle ich den gewünschten Wert durch die Cursortasten.

 

Auswahl des Gerätes. z.B. HDB Bug

create_command( "GKWI/radio/select_hdg", "select HDG-BUG for tuning",
                "select_hdg()", "", "" )

 

Diese Funktion habe ich mit der 0 der numerischen Tastatur verknüpft.

und macht folgendes:

 

function select_hdg()
  device_selected = _HDG
  clock1 = os.clock()
end

 

Nach Auswahl des HDG Bugs ist dieser mit den Cursortasten innerhalb einer gewissen Zeitspanne verstellbar.

 

Cursortasten

Diese habe ich mit folgenden Funktionen verknüpft:

Das letzte Argument (if check...) verwirklicht beim Gedrückthalten die Repeatfunktion

 

create_command( "GKWI/radio/major_tune_up", "major_tune_up",
                "reset_delaycount() major_tune_up()",
                "if check_delay() == 0 then major_tune_up() end",
                "" )

create_command( "GKWI/radio/major_tune_down",  "major_tune_down",
                "reset_delaycount() major_tune_down()",
                "if check_delay() == 0 then major_tune_down() end",
                "" )

 

Schaun wir uns major_tune_up() an:

 

function major_tune_up()
  check_timeout()
  if     device_selected == _COM1 then command_once( "sim/radios/stby_com1_coarse_up" )
  elseif device_selected == _COM2 then command_once( "sim/radios/stby_com2_coarse_up" )
  elseif device_selected == _NAV1 then command_once( "sim/radios/stby_nav1_coarse_up" )
  elseif device_selected == _NAV2 then command_once( "sim/radios/stby_nav2_coarse_up" )
  elseif device_selected == _ADF1 then command_once( "sim/radios/actv_adf1_hundreds_up" )
  elseif device_selected == _ADF2 then command_once( "sim/radios/actv_adf2_hundreds_up" )
  elseif device_selected == _HDG  then command_once( "sim/autopilot/heading_up" )
  elseif device_selected == _OBS1 then
    if VOR_selected[0] == 0 then
      command_once( "sim/radios/obs1_up" )
    else
      command_once( "sim/radios/obs2_up" )
    end
  elseif device_selected == _NONE then
    command_once( "sim/general/right" )
  end
 
   reset_clock()
end

 

Wurde vorher der HDB Bug selected (num 0), ruft Cursor rechts einmal die XP Funktion "sim/autopilot/heading_up"

Welches Datarefs dabei verändert wird, weiß ich selbst nicht, es ist aber auch nicht wichtig zu wissen.

 

Wenn du eine spezifische Frage hast, helfe ich dir gerne bei der Suche, dabei lerne ich selbst mehr über die Datarefs.

 

Gruß

Günther

 

radio_nav_tuning.lua

Share this post


Link to post
Share on other sites

Hallo "Günter mit h",

 

ich meinte den HDG-Knopf vom AP.

 

Deine Vorgehensweise ist im Groben auch die Meine, ich hätte mir halt nur eine Funktion gewünscht, wo ich einen Knopf drücke (z.B. den HDG-Knopf vom AP) und mir dann angezeigt wird (oder anhand einer Protokoll-Datei nachzulesen ist), welche DataRefs-Variable damit verknüpft ist. Somit bleibt nur rumprobieren, was sehr frustierend sein kann 😞

 

Die von Dir aufgezählten DataRefs-Variablen habe ich (zum großen Teil) schon erfolglos durchprobiert (mit Befehlen wie "create_positive_edge_trigger()" und "create_switch()") .

Jetzt werde ich mich mal mit den von dir aufgelisteten Beispielen beschäftigen, das wird etwas dauern....

 

Also erstmal vielen Dank für deine ausführliche Antwort, ich werde berichten...

 

Günter

Share this post


Link to post
Share on other sites

Ich habe für jeden Flieger einen eigenen Ordner mit lua-Scripten, welche nur für diesen Flieger geladen werden.

In diesem Folder gibt es auch jeweils ein Script mit dem Namen

 

initial_assignments.lua

 

In diesem Script definiere ich verschiedene Zuordnungen.

Für Yoke-Switches :


clear_all_axis_assignments()
set_axis_assignment( 0, "right toe brake", "normal" )
set_axis_assignment( 1, "left toe brake", "normal" )

.....

 

clear_all_button_assignments()

 

set_button_assignment( (12*40) + 10, "sim/general/zoom_in" )
set_button_assignment( (12*40) + 12, "sim/general/rot_right" )
set_button_assignment( (12*40) + 14, "sim/general/zoom_out" )
set_button_assignment( (12*40) + 16, "sim/general/rot_left" )

 

Für selbst gebastelte Schalter:

 

create_switch        ( (20*40) + 0, "sim/cockpit/electrical/battery_on")
create_switch        ( (20*40) + 1, "sim/cockpit/electrical/generator_on",0)
create_switch        ( (20*40) + 2, "sim/cockpit/electrical/generator_on",1)

...

 

----------------------

 

 

Zum AP HDG Knopf

 

Wenn ich vorher geschrieben habe, dass es nur die Datarefs zum Manipulieren gibt, ist nicht ganz richtig,

es gibt auch Funktionen.

 

Für den HDG Knopf rufe ich eine solche:

"sim/autopilot/heading"

 

Wenn du diese Funktion aus einem Script rufen willst,

geht das so:

command_once( "sim/autopilot/heading" )

 

Da der AP in der B200 einige Bugs aufweist, habe ich mir drumherum ein Script geschrieben.

Dieses ist für dich sicher nicht die Lösung, aber vielleicht ist das eine oder andere Detail hilfreich.

 

Gruß

Günther

 

B200_autopilot.lua

Share this post


Link to post
Share on other sites

.. der Befehl   command_once("sim/autopilot/heading") war der Heilsbringer. Damit schalte ich das Heading um (wenn vorher ein, dann wird es ausgeschaltet und umgekehrt).

 

Gibt es eine Liste gültiger "Funktionen"?

Die beiden von mir benötigten Funktionen "sim/autopilot/heading" und "sim/autopilot/altitude_hold" habe ich aus deinen Beispielen.

 

Also nochmals Danke...

 

Für die, die es interessiert:

Ich habe den Schalter 11 vom HOTAS WARTHOG mit folgenden Funktionen ausstatten wollen (nur B58):

untere Stellung = AP aus

mittlere Stellung = HDG ein

obere Stellung = ALT ein (HDG bleibt an)

Datei ist angehängt.

 

Günter

B58.lua

Share this post


Link to post
Share on other sites

Super.

Eine Kleinigkeit würde ich noch ändern.

Du machst u.a. den Zustand Heading abhängik von deiner Variablen is_HDG.

Das kann auch schiefgehen, z.B. wenn Heading aktiv ist und du die Luascripte nochmals lädst.

 

Ich würde lieber die tatsächlichen Zustände der Schalter verwenden (Dataref)

z.B.

 

local hdg_status        = dataref_table("sim/cockpit2/autopilot/heading_status")

function B58_Heading_Hold()

        if hdg_status[0] == 0 then then
          command_once( "sim/autopilot/heading" ) -- HDG wird umgeschaltet
        end

 

Kann sein, dass die Änderung unnötig ist.

Sollte dein Script jedoch irgendwann nicht das tun was es tun sollte,

könnte die beschriebene Änderung hilfreich sein.

 

 

Liste der Funktionen?

Ja, die gibt es.

In X-Plane, im Menü Settings/Keyboard z.B.

Dort links All anwählen und schon kannst du alle verfügbaren Funktionen sehen.

Den Cursor über einer Funktion geparkt zeigt nach wenigen Sekunden den vollen Namen der Funktion an.

 

Guten Rutsch!

 

/Günther

Share this post


Link to post
Share on other sites

.. hast recht, aber ist es nicht besser, wenn ich nur innerhalb der Funktion

function B58_Heading_Hold()

das Dataref abfrage bzw. in die lokale Variable kopiere:

hdg_status        = dataref_table("sim/cockpit2/autopilot/heading_status")

also:

 

local hdg_status

function B58_Heading_Hold()

        hdg_status        = dataref_table("sim/cockpit2/autopilot/heading_status")

        if hdg_status[0] == 0 then then
          command_once( "sim/autopilot/heading" ) -- HDG wird umgeschaltet
        end

end

 

Werde das mal ausprobieren (und mir die Liste der Funktionen ansehen), sobald der Kaffee wirkt...

 

Edit: sehe gerade, ist gar nicht notwendig, die Zuweisung innerhalb der Funktion zu machen, das muss anscheinend nur einmal gemacht werden, dann wird bei jedem Abfragen der lokalen Variablen der aktuelle Wert geholt, ist dann also ein Zeiger auf den Dataref....

 

Günter

 

 

Share this post


Link to post
Share on other sites

Hallo Ihr beiden!

Im ordner /"X-Plane"/Resources/Plugins gibts zwei (soger kommentierte) Listen: "Commands.txt" und "DataRefs.txt".

Vielleicht findest da, was Du suchst.

vlG

gerhard

Share this post


Link to post
Share on other sites

Hallo Gerhard,

ja, diese beiden Dateien kenne ich schon, aber da sind halt alle Datarefs enthalten, schön wäre es, wenn es eine Liste gäbe, wo die bei einem bestimmten Flieger tatsächlich genutzten Datarefs aufgelistet sind. Danke trotzdem..

 

Noch eine Frage:

wenn ich ein Lua-Script (bei Laufendem X-Plane) geändert habe, reicht es wohl nicht, wenn ich den Menüpunkt Plugins -> FlyWithLua -> Reload ... anklicke. Zumindest manchmal muss ich X-Plane neu starten, damit meine Änderungen wirksam werden. 😵

Wie kann ich also mein geändertes Script bei laufendem X-Plane aktivieren?

Share this post


Link to post
Share on other sites
vor 3 Stunden , Guenni99 sagte:

.. hast recht, aber ist es nicht besser, wenn ich nur innerhalb der Funktion

function B58_Heading_Hold()

das Dataref abfrage bzw. in die lokale Variable kopiere:

hdg_status        = dataref_table("sim/cockpit2/autopilot/heading_status")

also:

 

local hdg_status

function B58_Heading_Hold()

        hdg_status        = dataref_table("sim/cockpit2/autopilot/heading_status")

        if hdg_status[0] == 0 then then
          command_once( "sim/autopilot/heading" ) -- HDG wird umgeschaltet
        end

end

 

Werde das mal ausprobieren (und mir die Liste der Funktionen ansehen), sobald der Kaffee wirkt...

 

Edit: sehe gerade, ist gar nicht notwendig, die Zuweisung innerhalb der Funktion zu machen, das muss anscheinend nur einmal gemacht werden, dann wird bei jedem Abfragen der lokalen Variablen der aktuelle Wert geholt, ist dann also ein Zeiger auf den Dataref....

 

Günter

 

 

 

Genau,

hdg_status ist nur eine Referenz auf ein Array (Table) vom Typ eines einzelnen Wertes,

also die Speicheradresse an welcher das Array beginnt.

Der Index wird zur Berechnung des Offsets innerhalb des Arrays verwendet.

Index 0 ist demnach Startadresse + 0 * Größe eines Elementes  ==> Das erste Element des Arrays

Index 4 ist demnach Startadresse + 4 * Größe eines Elementes  ==> Das 5. Element des Arrays

 

Auch wenn das Array nur einen Wert enthält, muss der Index (0) angegeben werden.

Der Index (hier z.B. 0) wird wie folgt angegeben: hdg_status[0] 

 

Diese Adressen werden beim Start von FlyWithLua einmal angelegt und können dann im Script beliebig oft verwendet werden.

 

...h..    🙂

 

 

EDIT

 

Die Größe des Arrays steht in der Liste der Datarefs:

 

sim/aircraft/bodies/acf_fuse_cd_array    float[95]    y    // Index 0 bis Index 94
sim/aircraft/controls/acf_ail1_crat           float          y    // Index 0

 

Share this post


Link to post
Share on other sites
vor 2 Stunden , Guenni99 sagte:

Noch eine Frage:

wenn ich ein Lua-Script (bei Laufendem X-Plane) geändert habe, reicht es wohl nicht, wenn ich den Menüpunkt Plugins -> FlyWithLua -> Reload ... anklicke. Zumindest manchmal muss ich X-Plane neu starten, damit meine Änderungen wirksam werden. 😵

Wie kann ich also mein geändertes Script bei laufendem X-Plane aktivieren?

 

Genau so, mit Reload.

Vorher sollte das geänderte Script gespeichert worden sein, das könnte man schon einmal vergessen.

 

 

Share this post


Link to post
Share on other sites
vor 2 Stunden , Guenni99 sagte:

 

ja, diese beiden Dateien kenne ich schon, aber da sind halt alle Datarefs enthalten, schön wäre es, wenn es eine Liste gäbe, wo die bei einem bestimmten Flieger tatsächlich genutzten Datarefs aufgelistet sind. Danke trotzdem..

 

 

 

Kennst du den dataref Editor?

Damit sieht man zumindest, welche Datarefs sich bei welchen Aktionen ändern.

Share this post


Link to post
Share on other sites

.. ich habe statt hdg_status[0] geschrieben hdg_status, und das hat lustige Effekte zur Folge.... so dachte ich, dass mein geändertes Script nicht aktiv war... 🤣

anbei also das modifizierte Script. Am Anfang setze ich die benutzten Datarefs auf 0, so habe ich einen definierten Anfangszustand.

Dataref-Editor... ohne den komme ich nicht mehr aus 😎

 

Jetzt habe ich also etwas Zeit, mir deine Beispiele anzusehen.... if-Abfragen als Parameter in create_command und so...🤢

....-..

B58.lua

Share this post


Link to post
Share on other sites

Hello in die Runde,

 

ich möchte euch gerne noch einen weiteren editor empfehlen. Habe mit diesem Werkzeug sehr gute Erkenntnisse gewonnen. Es ist sozusagen die erweiterung des normalen editors nur umfänglicher im aufgabengebiet.

Die speziellen datarefs eines fliegers z.b. b58 sind mit laminar gekennzeichnet und auch nutzbar ansteuerbar.

 

Viel spass beim tüffteln

 

https://github.com/leecbaker/datareftool/releases

Share this post


Link to post
Share on other sites

Danke, ich schaue es mir gerne an.

 

EDIT

 

Danke!

Sieht sehr gut aus.

Jetzt muss ich damit ein wenig spielen 🙂

Share this post


Link to post
Share on other sites
vor 3 Stunden , Guenni99 sagte:

 

if-Abfragen als Parameter in create_command und so...

 

Die Argumente sind ganz einfach Texte.

Als Text wird Lua Code übergeben.

Der Lua Code kann natürlich auch einfach ein Funktionsaufruf sein.

 

 

EDIT

Die Initialisierung kann auch anders erfolgen.

Der Interpreter liest beim Start das Script und lernt dabei die Variablen und Funktionen und führt gefundenen Code aus,

aber den eben nur genau einmal.

 

Deshalb könntest du die Initialisierung irgendwo in das Script schreiben, auserhalb einer Funktion.

 

if (PLANE_ICAO == "BE58") then

   local akt_HDG = dataref_table("sim/cockpit2/autopilot/heading_status") -- heading_mode geht auch
   local akt_ALT = dataref_table("sim/cockpit2/autopilot/altitude_hold_status") -- altitude_mode ist nie auf 0

 

   akt_HDG = 0

   ...

 

Share this post


Link to post
Share on other sites
vor 20 Stunden , c.zeiss sagte:

.... weiteren editor empfehlen....

Danke an c.zeiss für den Tipp mit dem "DataRefTool", da habe ich ja noch bis zum nächsten Jahr genug zum Spielen... 😎

 

vor 17 Stunden , Othello sagte:

....Der Interpreter liest beim Start das Script und lernt dabei die Variablen und Funktionen und führt gefundenen Code aus...

Im Dokument "FlyWithLua_Manual_en.pd" steht ja eigentlich vieles drin, aber ein Manual komplett durchlesen und dann alles anwenden ist nicht so mein Ding, lieber probieren und dann das Manual lesen ..😜

Danke an ....h.. für die geduldige Unterstützung, im nächsten Jahr gehts weiter... Das HOTAS Warthog-Gelumpe hat noch viele Schalter und Knöpfe, die es sinnvoll zu belegen gilt.

 

In diesem Sinne allen einen guten Rutsch und weiterhin viel Spaß mit diesem tollen Hobby, bei dem immer mehr Fragen auftauchen, je intensiver man sich damit beschäftigt...:glider_s:

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this