Settingz85 Posted April 12, 2013 Share Posted April 12, 2013 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.com/de/dev_journal/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.com/de/dev_journal/lua-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 Link to comment Share on other sites More sharing options...
Dieter474 Posted April 12, 2013 Share Posted April 12, 2013 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 1 Link to comment Share on other sites More sharing options...
towsim Posted April 12, 2013 Share Posted April 12, 2013 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 1 [sIGPIC][/sIGPIC] Link to comment Share on other sites More sharing options...
Settingz85 Posted April 12, 2013 Author Share Posted April 12, 2013 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 Link to comment Share on other sites More sharing options...
Shadow314 Posted August 25, 2013 Share Posted August 25, 2013 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?) --- 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 local data = udp:receive() Wenn ich folgendes mache, hängt es sich trotzdem auf 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! 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 Link to comment Share on other sites More sharing options...
Retsilf Posted October 29, 2013 Share Posted October 29, 2013 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 Link to comment Share on other sites More sharing options...
towsim Posted October 30, 2013 Share Posted October 30, 2013 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 devices["UHF_RADIO"] = counter()--54 In ClickableData.lua findet man die Bedienelemente der Box. z.B. Der Funktionsschalter mit 4 Stellungen 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: UHFradio = GetDevice(54) UHFRadio:performClickableAction(3008, 0.2) Das Cockpit hat den Index null. 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: 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. 1 [sIGPIC][/sIGPIC] Link to comment Share on other sites More sharing options...
Dirt Diver Posted May 12, 2014 Share Posted May 12, 2014 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][/sIGPIC] Link to comment Share on other sites More sharing options...
towsim Posted May 12, 2014 Share Posted May 12, 2014 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][/sIGPIC] Link to comment Share on other sites More sharing options...
Recommended Posts