Guenni99 39 Posted December 28, 2018 Share Posted December 28, 2018 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 Link to comment Share on other sites More sharing options...
Othello 549 Posted December 29, 2018 Share Posted December 29, 2018 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 Link to comment Share on other sites More sharing options...
Guenni99 39 Posted December 29, 2018 Author Share Posted December 29, 2018 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 Link to comment Share on other sites More sharing options...
Othello 549 Posted December 29, 2018 Share Posted December 29, 2018 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 Link to comment Share on other sites More sharing options...
Guenni99 39 Posted December 29, 2018 Author Share Posted December 29, 2018 .. 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 Link to comment Share on other sites More sharing options...
Othello 549 Posted December 29, 2018 Share Posted December 29, 2018 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 Link to comment Share on other sites More sharing options...
Guenni99 39 Posted December 30, 2018 Author Share Posted December 30, 2018 .. 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 Link to comment Share on other sites More sharing options...
OE3GSU 100 Posted December 30, 2018 Share Posted December 30, 2018 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 Link to comment Share on other sites More sharing options...
Guenni99 39 Posted December 30, 2018 Author Share Posted December 30, 2018 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? Link to comment Share on other sites More sharing options...
Othello 549 Posted December 30, 2018 Share Posted December 30, 2018 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 Link to comment Share on other sites More sharing options...
Othello 549 Posted December 30, 2018 Share Posted December 30, 2018 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. Link to comment Share on other sites More sharing options...
Othello 549 Posted December 30, 2018 Share Posted December 30, 2018 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. Link to comment Share on other sites More sharing options...
Guenni99 39 Posted December 30, 2018 Author Share Posted December 30, 2018 .. 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 Link to comment Share on other sites More sharing options...
c.zeiss 0 Posted December 30, 2018 Share Posted December 30, 2018 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 Link to comment Share on other sites More sharing options...
Othello 549 Posted December 30, 2018 Share Posted December 30, 2018 Danke, ich schaue es mir gerne an. EDIT Danke! Sieht sehr gut aus. Jetzt muss ich damit ein wenig spielen Link to comment Share on other sites More sharing options...
Othello 549 Posted December 30, 2018 Share Posted December 30, 2018 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 ... Link to comment Share on other sites More sharing options...
Guenni99 39 Posted December 31, 2018 Author Share Posted December 31, 2018 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... Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.