Jump to content

*.Lua export


Settingz85

Recommended Posts

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

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

  • Like 1
Link to comment
Share on other sites

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

  • Like 1

[sIGPIC][/sIGPIC]

Link to comment
Share on other sites

  • 4 months later...

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

  • 2 months later...

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

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.

  • Thanks 1

[sIGPIC][/sIGPIC]

Link to comment
Share on other sites

  • 6 months later...

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

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

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...