Jump to content

Dataref Überwachen


Othello

Recommended Posts

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

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

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

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. Privacy Policy & Terms of Use