Announcement

Collapse
No announcement yet.

*.Lua export

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    *.Lua export

    Hallo zusammen,
    ich wollte mich ein wenig in die Thematik des LUA export einarbeiten. Dabei habe ich mich zunächst an folgenden Beitrag orientiert

    http://www.digitalcombatsimulator.co...lua-export/#11

    Leider endete dort auch schon alles, da ich die in dem Beitrag beschriebenen Ordner nicht finden kann. Beispiel:

    "Spieler können Daten aus DCS extrahieren und zusätzlich Eingabefehle nach DCS durch ein spezielles Script welches sich unter Config\Export\Export.lua befindet"

    Leider exisitiert kein Ordner namens "Export"
    Unter dem Pfad DCS/Scripts kann ich jedoch die gesuchte Export.lua finden. In dieser steht unter anderem

    "-- Please, set EnableExportScript = true in the Config/Export/Config.lua file
    -- to activate this script!"

    Auch diese Datei/Ordner kann ich nicht finden.
    Weiter noch...

    "--- All user modifications should go to $HOME\Saved Games\DCS\Scripts\Export.lua"

    Auch dort befindet sich kein Ordner namens "Scripts".
    Daher die Frage/n: Ist folgende beschreibung noch aktuell (http://www.digitalcombatsimulator.co...-export/#11)??
    Muss ich eventuell fehlende Ordner oder Unterordner selber erstellen und die Export.Lua dorhin kopieren??
    Wo befinded sich die Datei Config.Lua??

    allen ein schönes Wochenende

    #2
    Hallo Fritz, ich helfe dir gerne. Ich vermute es liegt daran, dass DCS Word die von Helios erzeugte export.lua zu finden unter C:\Program Files\Eagle Dynamics\DCS World\Config\Export.lua nicht mehr berücksichtigt. Diese ist seit dem letzten Update nach C:\Users\Dieter\Saved Games\DCS\Scripts\export.lua verschoben worden und Helios kennt diese Änderung noch nicht. Du musst nun, diese export.luai aus dem alten Verzeichnis kopieren und in dieses neue von dir erstellte Verzeichnis kopieren. Beachte aber, dass die im Benutzerverzeichnis anzulegen ist, bei mir \Users\Dieter\ bei dir unter?
    Ebenso haben die jetzt eine Funktion integriert, wenn du im Mehrspielermodus bist, dass DCS Word über die export.lua wenn es der stellende Server nicht will keine Daten mehr ausgibt und Helios nicht geht.
    Wenn du weitere Hilfe brauchst melde dich, oder auf meiner Homecockpitseite unter a10-homecockpit.de findest du eine Mail Adresse.

    Gruß dieter474

    Comment


      #3
      Du musst den Ordner $HOME\Saved Games\DCS\Scripts manuell anlegen und die gefundene Export.lua dort hin kopieren. Mit der neuen Version wird die Export.lua dort von DCS World ausgewertet. Config.lua ist nicht mehr relevant.
      Gruss,
      Mike
      sigpic

      Comment


        #4
        Danke für eure schnelle Hilfe und Tipps. Ich werde mich heut abend ein wenig mit der lua geschichte beschäftigen. Bin mal gespannt mit welchen Ergebnissen.

        Gruss

        Comment


          #5
          Hallo,

          ich weis das es nicht schön ist auf ewig alte Beiträge in einem Forum zu antworten, ich finde es in diesem Fall aber ein wenig passender als einen neuen Beitrag zu eröffnen.

          Ich habe auch damit begonnen mich mit LUA auseinander zu setzen, und habe mich schon ziemlich tief durchs Forum gegraben, und war auch schon verhältnismässig ziemlich erfolgreich.

          Mit meiner Export.lua schaffe ich es ein paar Informationen via UDP an ein kleines Testprogramm zu senden.

          An dieser Stelle treten aber zwei ganz wichtige Fragen auf:

          1. Ich kann Daten (Strings) via UDP sehr einfach versenden, aber das Empfangen will nicht so recht.



          Hier erst einmal der allgemeine Aufbau meiner Export.lua
          Vorweg als Info: Das ist nicht der Weg für UDP-Daten der in der Export.lua vorgeschlagen wird.
          Habe ich diesen benutzt hat sich DCS aufgehangen. (Liegt vllt. daran, dass sich von der Lua-Verson 2006 bis heute ein wenig was geändert hat?)
          Code:
          --- DO NOT EDIT.
          --- This file is for reference purposes only
          --- All user modifications should go to $HOME\Saved Games\DCS\Scripts\Export.lua
          
          -- Data export script for Lock On version 1.2.
          -- Copyright (C) 2006, Eagle Dynamics.
          -- See http://www.lua.org for Lua script system info 
          -- We recommend to use the LuaSocket addon (http://www.tecgraf.puc-rio.br/luasocket) 
          -- to use standard network protocols in Lua scripts.
          -- LuaSocket 2.0 files (*.dll and *.lua) are supplied in the Scripts/LuaSocket folder
          -- and in the installation folder of the Lock On version 1.2. 
          
          
          
          
          -- AKTIVIEREN FÜR DEBUG
          --local default_output_file = nil
          
          function LuaExportStart()
          -- Works once just before mission start.
          -- Make initializations of your files or connections here.
          
          
          -- File
          -- AKTIVIEREN FÜR DEBUG
          --default_output_file = io.open("C:\\Test\\Test.log", "w")
          
          
          -- UDP
          package.path  = package.path..";.\\LuaSocket\\?.lua"  
          package.cpath = package.cpath..";.\\LuaSocket\\?.dll"
          port = 4000 -- Port zum Testen, wird auf > 10000 gelegt
          socket = require("socket")
          ip = "192.168.1.10"
          udp = socket.try(socket.udp())
          
          
          
          end
          
          function LuaExportBeforeNextFrame()
          -- Works just before every simulation frame.
          
          
          
          
          -- 	Einschalten der Main Left Pump
          --	local Device = GetDevice(36)
          --	Device:performClickableAction(3007, 0.0) - Main Pump left
          
          
          end
          
          function LuaExportAfterNextFrame()
          -- Works just after every simulation frame.
          
          
          end
          
          function LuaExportStop()
          -- Works once just after mission stop.
          -- Close files and/or connections here.
          
          -- 	AKTIVIEREN FÜR DEBUG
          --	default_output_file:close()
          --	default_output_file = nil
          
          	udp:close()
          
          
          
          end
          
          function LuaExportActivityNextEvent(t)
          	local tNext = t
          
          -- Put your event code here and increase tNext for the next event
          -- so this function will be called automatically at your custom
          -- model times. 
          
          
          	-- Variablen auslesen
          	local altBar = 			LoGetAltitudeAboveSeaLevel()
          	local altRad = 			LoGetAltitudeAboveGroundLevel()
          	local pitch, bank, yaw = 	LoGetADIPitchBankYaw()
          
          
          	local MainPanel = 		GetDevice(0)
          	local MasterArm = 		MainPanel:get_argument_value(375)
          	local GunArm = 			MainPanel:get_argument_value(376)
          	local LaserArm = 		MainPanel:get_argument_value(377)
          	local TGPOnOff = 		MainPanel:get_argument_value(378)
          
          
          	-- Sendedaten aufbereiten
          
          	udpsend = string.format("pitch=%.2f", 57.3*pitch) .. ";" 			-- Nase auf/ab
          	udpsend = udpsend .. string.format("bank=%.2f", 57.3*bank) .. ";" 		-- Tragflächen runter/rauf 
          	udpsend = udpsend .. string.format("yaw=%.2f", 57.3*yaw) .. ";"			-- Ruder
          	udpsend = udpsend .. string.format("altBar=%.f", 3.4*altBar) .. ";"		-- Höhe über dem Meer 
          	udpsend = udpsend .. string.format("altRad=%.f", 3.4*altRad) .. ";"		-- Höhe über Ground
          	udpsend = udpsend .. string.format("MasterArm=%.1f", MasterArm) .. ";"		-- MasterArm
          	udpsend = udpsend .. string.format("GunArm=%.1f", GunArm) .. ";"		-- GunArm
          	udpsend = udpsend .. string.format("LaserArm=%.1f", LaserArm) .. ";"		-- LaserArm
          	udpsend = udpsend .. string.format("TGPOnOff=%.f", TGPOnOff) .. ";"		-- TGPOnOff
          
          
          	socket.try(udp:sendto(udpsend, ip, port))	 
          	
          
          
          
          
          	tNext = tNext + 0.1
          
          
          	return tNext
          end

          Wenn ich jetzt in der Funktion function LuaExportBeforeNextFrame() folgendes ausprogrammiere hängt sich DCS auf (ich vermute, dass die Export.lua zwingend auf Daten wartet die Empfangen werden, und deshalb den Prozess blockiert

          Code:
          local data = udp:receive()
          Wenn ich folgendes mache, hängt es sich trotzdem auf

          Code:
          local data = socket.try(udp:receive())
          Irgendwo in einem LUA-Beispiel habe ich eine Funktion gefunden die mir nicht ganz klar ist, aber DCS hängt sich mal nicht auf. Empfangen tue ich trotzdem nichts!

          Code:
          local data = udp:receive("*1")
          Hat also nun jemand einen Ansatz für mich wie ich Daten empfangen kann?



          Die zweite Frage bezieht sich auf das Auslesen/Schreiben von Werten.
          Wie ihr seht habe ich ein paar Variablen gefunden wie z.B. die Stellung von MasterArm, etc.
          Die Liste der Devices habe ich auch gefunden, das hilft auch schonmal massiv weiter.

          Wie finde ich nun herraus welche Variablen was machen? Gibt es irgendwo eine Liste?
          Das File aus dem ich die Funktionen für Masterarm usw. habe beinhaltet ja noch weitere Einträge, aber sobald ich etwas nehme was nicht auf dem MainPanel (gedDeviceID(0)) liegt, bekomme ich das nicht hin.

          Das ich für das Schreiben (was bisher ja nur von Hand zum Testen ginge) einen Offset von 3000 addieren muss habe ich auch schon herrausgefunden.

          Ich hoffe es gibt den ein oder anderen der mir weiterhelfen könnte.

          Grüße

          Shadow

          Comment


            #6
            Das würde mich auch interessieren. Insbesondere die Liste der Variablen oder besser "Devices" und die zugehörigen Argumente. Vom DCS Support bin ich auf das Forum verwiesen worden - ich meine "Input / Output" oder so ähnlich.

            Hab mich damit aber noch nicht wirklich auseinandergesetzt.

            Viel Erfolg

            Comment


              #7
              Die meisten Funktionen, die in der 'alten' Export.lua als Beispiel aufgeführt wurden, funktionieren leider nicht. Wenn man Cockpit-Daten auslesen will muss, man einen kleinen Umweg gehen. Dazu sind zwei LUA Scripts wichtig (hier beispielhaft für die A10-C):
              DCS World\Mods\aircrafts\A-10C\Cockpit\Scripts\devices.lua
              und
              DCS World\Mods\aircrafts\A-10C\Cockpit\Scripts\ clickabledata.lua
              In devices.lua findet man den Index für ein bestimmtes Aircraft Device.
              In clickabledata.lua findet man die Bedienelement für das Device.
              Um z.B. Das UHF Radio auszulesen geht man folgenden Weg:
              Aus Devices.lua erfährt man, dass das UHF Radio den Index 54 hat
              Code:
               
              devices["UHF_RADIO"] = counter()--54
              In ClickableData.lua findet man die Bedienelemente der Box. z.B. Der Funktionsschalter mit 4 Stellungen
              Code:
               
              elements["PTR-ANARC164-FUNCTION"] = multiposition_switch(_("Function Dial") , devices.UHF_RADIO, device_commands.Button_8, 168, 4, 0.1)
              device_commands.Button_8 steht für den index 3008. Um den Schalter in die Position 3 zu schalten:
              Code:
               
              UHFradio = GetDevice(54)
              UHFRadio:performClickableAction(3008, 0.2)
              Das Cockpit hat den Index null.
              Code:
               
              Cockpit = GetDevice(0)
              Jede Anzeige oder Schalter hat innerhalb des Cockpits einen index. Um diese abzufragen benutzt man die Standardfunktion
              Device: get_argument_value(n)
              Man erhält eine Fließkommawert, der der augenblicklichen Situation entspricht. Der Wert ist in der Regel zwischen 0.0 und 1.0. Der Wert muss dann entsprechend skaliert werden um eine darstellbare Anzeige zu bekommen.
              Beispiel fur verschiedene Anzeigeelemente:
              Code:
               
              Cockpit:get_argument_value(540), -- AOA index high
              Cockpit:get_argument_value(541), -- AOA index normal
              Cockpit:get_argument_value(542), -- AOA index low
              Cockpit:get_argument_value(662), -- Gun ready
              Cockpit:get_argument_value(663), -- Nosewheel steering
              Cockpit:get_argument_value(730), -- Refueling ready
              Cockpit:get_argument_value(731), -- Refueling latched
              Cockpit:get_argument_value(732), -- Refueling disconnect
              Cockpit:get_argument_value(664), -- Marker beacon
              Cockpit:get_argument_value(665), -- canopy unlocked
              Cockpit:get_argument_value(655), -- landing light switch
              Cockpit:get_argument_value(716), -- gear lever 
              Cockpit:get_argument_value(654), -- anti skid
              Cockpit:get_argument_value(737), -- red gear lever light
              Cockpit:get_argument_value(404)) -- Master Caution
              So lässt sich im Prinzip alles im Cockpit abfragen. Die Index Werte sind allerdings schwierig zu ermitteln. Ich habe mir ein kleines Programm gebastelt, das alle Cockpit Elemente zwischen 0 und 4000 im Loop abfragt und in einem Array speichert. Wird im nächsten Loop an einem Index eine Veränderung erkannt, weil ich im Cockpit einen Schalter umgelegt habe, so wird der entsprechend Index ausgegeben.
              Bei aller cleveren LUA Schrauberei habe ich aber schnell erkannt, dass eine selbstgestrickte DLL ungleich effektiver ist. Hier habe ich alle Möglichkeiten von C/C++ und die mächtige Windows API zur Verfügung. Das Erste was ich gemacht habe, war die Netzverbindung in die DLL zu verlegen um von der String-Pfriemelei befreit zu sein. Aber DLL ist eine andere Geschichte.
              sigpic

              Comment


                #8
                Hallo zusammen,

                Ich habe derzeit einige Probleme mit der Export.lua.
                Im singleplayer funktioniert das Script einwandfrei und alle Daten werden von der CDU ausgelesen. Sobald ich allerdings in den Mehrspielermodus wechsle funktioniert das Script nicht mehr. In der Network.cfg habe ich bereits "allow_object_export = true," gesetzt, da ja bereits in den Foren angegeben wurde, dass die Config.lua nicht mehr von DCS berücksichtigt wird.

                Starte ich nun einen Server und lese im Anschluss die dcs.log aus, finde ich in der Zeile 231 folgendes:

                00034.466 ALERT EDCORE: Can't execute Lua file C:\Users\Alexander\Saved Games\DCS\Scripts\Export.lua - [string "C:\Users\Alexander\Saved Games\DCS\Scripts\..."]:4: attempt to index a nil value
                Hat jemand eine Ahnung wo bei mir der Fehler liegt?

                Danke
                sigpic

                Comment


                  #9
                  Prüfe mall alle Devices die Du abfragst , ob die zum Zeitpunkt existieren. Die Meldung im LOG sagt aus, dass Du über einen Index in Leere gegriffen hast. Dazu kommt, dass im Mehrspielermodus das Signal 'LuaExportStart' noch vor dem eigentlichen Übungsstart von DCS aufgerufen wird.Das führt dazu Aircraft Devices abzufragen, obwohl noch kein Aircraft existiert. Ich prüfe zur Sicherheit alle benötigten Device Adressen bevor ich diese abfrage:

                  VHF1Radio = GetDevice(55) or 0
                  if VHF1Radio ~= 0 then
                  storageValid = 1
                  end

                  Erst wenn 'storageValid' mit 1 gemeldet wird, greife ich auf das Device zu.Diese Situation tritt auch auf wenn während des Mehrspielermodus der Flugzeugtyp gewechselt wird. Während des Wechsels ist kein Aircraft aktiv was dazu führt das die Device Adressen ungültig werden bis ein neues Aircraft gewählt ist.
                  sigpic

                  Comment

                  Working...
                  X