Othello 549 Posted October 27, 2017 Share Posted October 27, 2017 Hallo zusammen. Ich stehe öfters vor dem Problem, ein Dataref zu überwachen, also darauf zu warten, dass eine Variable ihren Wert ändert. Bisher löse ich das z.B. so: ------------------------------------------ local mode = dataref_table("com/dkmp/BT3[100]") local free_slaved = dataref_table("sim/cockpit/gyros/gyr_free_slaved") local gyr_mode = 1 -- slaved mode local lastmode = 0 function check_mode() if ((mode[0] == 1)) then if (lastmode == 0) then -- toggle free/slaved if (free_slaved[2] == 0 )then free_slaved[2] = 1 else free_slaved[2] = 0 end lastmode = 1 end else lastmode = 0 end end do_every_frame("check_mode()") ------------------------------------------------- Zu einem anderen Thema hat X-Friese angemerkt: Die create_... Funktionen erzeugen eine im Hintergrund permanent aktive Logikschaltung, als hätte man eine SPS verdrahtet. Eine positive Flanke meint in der SPS Welt dass ein Signaleingang von 0 auf 1 wechselt, du also die Taste beginnst zu drücken. Jetzt meine Frage: Gibt es so etwas ähnliches auch für datarefs, z.B. so: create_...(dataref, value_from, value_to, function_to_call) Mein oben genanntes Beispiel könnte dann so aussehen: create_...("com/dkmp/BT3[100][0]", 0, 1, "check_mode()") Wenn es so etwas bisher nicht gibt, würde ich es gerne als RFE an Mr. X-Friese weitergeben. Gruß Othello Link to comment Share on other sites More sharing options...
X-Friese 34 Posted October 29, 2017 Share Posted October 29, 2017 Puh, das ist bisher so nicht möglich. Aber eine gute Idee für eine Erweiterung der Syntax von FlyWithLua. Ich würde es aber unabhängig von den create_...() Funktionen ansiedeln, da es sich eher um Event-Handler handelt als um die Auswertung der Joystikknöpfe. Vielleicht sähe der Code dann so aus: do_on_change_of( "com/dkpm/BT3[100]", "my_function()" ) Im Grunde wäre es ein Makro zu: local ref_value_to_observe = XPLMFindDataRef("com/dkpm/BT3[100]") last_value_to_observe = XPLMGetDatai(ref_value_to_observe) local function my_function_event_trigger() value_to_observe = XPLMGetDatai(ref_value_to_observe) if last_value_to_observe ~= value_to_observe then last_value_to_observe = value_to_observe my_function() end end do_every_frame("my_function_event_trigger()") Ob das Beispiel so passt weiß ich nicht, "com/dkpm/BT3[100]" sagt mir als DataRef nichts. Die neue Funktion do_on_change_of("DataRef", "Lua Code to execute") würde dann den Code des zweiten Arguments ausführen, immer wenn sich der Wert der Variable ändert. Ist das was du suchst? Link to comment Share on other sites More sharing options...
Othello 549 Posted October 29, 2017 Author Share Posted October 29, 2017 Danke für die Antwort. Das Dataref "com/dkpm/BT3[100]" ist eines von Hunderten, die zur B200 von Carenado gehören. Ich weiß nicht, wie FlywithLua intern arbeitet. Ich gehe bisher davon aus, dass intern in "Kernel?" diverse Funktionen effizienter zu verwirklichen sind, als in den Scripten. Deshalb dachte ich, dass der do_every_frame() part in c/c++ codiert effizienter sein könnte. Wie ich sehe, wäre die neue Funktion dann doch wieder im Prinzip ein do_every_frame, oder misverstehe ich dich in diesem Punkt? Sollte eine interne Funktion wirklich effizienter sein, Ich würde mir eine Funktion wie do_on_change_of( "com/dkpm/BT3[100]", "my_function()" ) auch mit 4 Parametern wünschen. Die 2 weiteren würden angeben, bei welchem Wertewechsel der Callback stattfinden soll (from, to), die Prüfung des neuen Wertes würde sich dann im Script erübrigen. Gruß Günther EDIT Mein Beispiel in meinem ersten Posting macht folgendes: In der B200 kann MSI und RMI zwischen free und slaved mode umgeschaltet werden. Der Button im Cockpit "com/dkpm/BT3[100]" liefert eine Null. Wird er eingedrückt liefert er solange eine 1, bis er wieder logelassen wird. Der Übergang von 0 auf 1 wird in meinem Script benutzt, um den Mode zwischen free und slaved zu toggeln. Der Wechsel von 1 auf Null interessiert mich nicht. Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.